JSON 분석 라 이브 러 리 의 Gson (2) - 범 형 대상 맵, List 와 JSON 문자열 의 상호 전환

170782 단어 JSON
JSON 분석 라 이브 러 리 의 Gson (2) - 범 형 대상 맵, List 와 JSON 문자열 의 상호 전환
- Gson 라 이브 러 리 학습, json 데이터 생 성 및 해석, json 문자열 과 자바 대상 상호 전환
머리말
본 고 는 앞의 글 을 이 어 기본 적 인 Gson 용법 을 계속 소개 한다.이 글 은 맵 < >, List < > 등 일반적인 집합 과 JSON 문자열 의 상호 전환 을 어떻게 실현 하 는 지 소개 한다.
2. Gson 의 기본 사용



범 형 집합 유형 대상 의 직렬 화 와 반 직렬 화
---------------------------------------------------------------------------------------------------

상황 1 [비 범 형]: 자바 배열 의 직렬 화 와 반 직렬 화
배열 은 범 형 과 달리 배열 은 범 형 이 아니다.
Java Array ===》JSON String
JSON String ===》 Java Array
       
       
       
       
Gson  gson = new GsonBuilder()//
        .setPrettyPrinting()// ( )
        .setDateFormat("yyyy-MM-dd HH:mm:ss") //
        .create();
User user1 = new User("1", " ", new Date());
User user2 = new User("2", " ", new Date());
User user3 = new User("3", " ", new Date());
User[] usersArray = { user1, user2, user3 }; //
/**
 * 
 */
String jsonArrString = gson.toJson(usersArray);
System.out.println("  ==》 " + jsonArrString);
/**
 *   ==》 [
  {
    "id": "1",
    "name": " ",
    "birthday": "2017-05-03 16:06:50"
  },
  {
    "id": "2",
    "name": " ",
    "birthday": "2017-05-03 16:06:50"
  },
  {
    "id": "3",
    "name": " ",
    "birthday": "2017-05-03 16:06:50"
  }
]
 */
/**
 * JSON , class, User [].class
 */
User[] usersArr = gson.fromJson(jsonArrString, User[].class);
for (int i = 0; i < usersArr.length; i++) {
    User u1 = usersArr[i];
    System.out.println("JSON  ==》 " + u1);
    /*
     * User  ==》 User [id=1, name= , birthday=Wed May 03 16:14:14 CST 2017]
       User  ==》 User [id=2, name= , birthday=Wed May 03 16:14:14 CST 2017]
       User  ==》 User [id=3, name= , birthday=Wed May 03 16:14:14 CST 2017]
     */
}
注意:数组的字节码文件可以反射出具体的数组中的对象类型,但是List不能直接用List.class 或List.class。因为泛型编译成字节码时是擦除类型的,List和List在编译成字节码后完全一样,没区别。

泛型集合得用  new TypeToken(List){}.getType() 作为反序列的第二个参数。


情况2 :Java  Map的序列化与反序列化

实体类:
         
         
         
         
public   class  Role {
    private String id;
    private String name;
    private String title;
    public Role() {
        super();
    }
    public Role(String id, String name, String title) {
        super();
        this.id = id;
        this.name = name;
        this.title = title;
    }
// , getter setter 、toString
}

Map<String, List extends Object>>  ===》JSON String
JSON String   ===》  Map <String,  List <Object>>

         
         
         
         
package  com.chunlynn.gson;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
public class GsonTest10 {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder()//
                .setPrettyPrinting()// ( )
                .setDateFormat("yyyy-MM-dd HH:mm:ss") //
                .create();
        User user1 = new User("1", " ", new Date());
        User user2 = new User("2", " ", new Date());
        User user3 = new User("3", " ", new Date());
        List<User> userList = new ArrayList<User>();
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        Role role1 = new Role("1001", "chunlynn", "admin");
        Role role2 = new Role("1002", "jeff", "vistor");
        List<Role> roleList = new ArrayList<Role>();
        roleList.add(role1);
        roleList.add(role2);
        Map<String, List extends Object>> map = new LinkedHashMap<String, List extends Object>>(); //
        // Map map2 = new LinkedHashMap(); //
        // Map> map3 = new LinkedHashMap>();// , ,put
        map.put("users", userList);
        map.put("roles", roleList);
        /**
         * [7] Map JSON
         */
        String jsonStr = gson.toJson(map);
        System.out.println("Map JSON  ==》 " + jsonStr);
        /*Map JSON  ==》 
         {
          "users": [
            {
              "id": "1",
              "name": " ",
              "birthday": "2017-05-03 17:04:12"
            },
            {
              "id": "2",
              "name": " ",
              "birthday": "2017-05-03 17:04:12"
            },
            {
              "id": "3",
              "name": " ",
              "birthday": "2017-05-03 17:04:12"
            }
          ],
          "roles": [
            {
              "id": "1001",
              "name": "chunlynn",
              "title": "admin"
            },
            {
              "id": "1002",
              "name": "jeff",
              "title": "vistor"
            }
          ]
        }
        */
        /**
         * [8] JSON Map
         */
        //  ,Map
        Type mtype = new TypeToken<Map<String, List<Object>>>() {
        }.getType();
        Map<String, List<Object>> retMap = gson.fromJson(jsonStr, mtype);
        System.out.println("retMap == > " + retMap);
        for (Map.Entry<String, List<Object>> p : retMap.entrySet()) {
            System.out.println("key ==" + p.getKey() + " , " + "value==" + p.getValue());
            /*
             * key ==users , value==[{id=1, name= , birthday=2017-05-03 17:55:16}, {id=2, name= , birthday=2017-05-03 17:55:16}, {id=3, name= , birthday=2017-05-03 17:55:16}]
               key ==roles , value==[{id=1001, name=chunlynn, title=admin}, {id=1002, name=jeff, title=vistor}]
             */
        }
        Map<String, Object> retMap2 = gson.fromJson(jsonStr, mtype);
        System.out.println("retMap2 == > " + retMap2);
        for (Map.Entry<String, Object> p : retMap2.entrySet()) {
            System.out.println("key2 ==" + p.getKey() + " , " + "value2==" + p.getValue());
            /*
             * key2 ==users , value2==[{id=1, name= , birthday=2017-05-03 17:55:16}, {id=2, name= , birthday=2017-05-03 17:55:16}, {id=3, name= , birthday=2017-05-03 17:55:16}]
               key2 ==roles , value2==[{id=1001, name=chunlynn, title=admin}, {id=1002, name=jeff, title=vistor}]
             */
        }
        Map<String, List extends Object>> retMap3 = gson.fromJson(jsonStr, mtype);
        System.out.println("retMap3 == > " + retMap3);
        for (Map.Entry<String, List extends Object>> p : retMap3.entrySet()) {
            System.out.println("key3 ==" + p.getKey() + " , " + "value3==" + p.getValue());
            /*
             * key3 ==users , value3==[{id=1, name= , birthday=2017-05-03 17:55:16}, {id=2, name= , birthday=2017-05-03 17:55:16}, {id=3, name= , birthday=2017-05-03 17:55:16}]
               key3 ==roles , value3==[{id=1001, name=chunlynn, title=admin}, {id=1002, name=jeff, title=vistor}]
             */
        }
        /*
        retMap == > {users=[{id=1, name= , birthday=2017-05-03 17:43:05}, {id=2, name= , birthday=2017-05-03 17:43:05}, {id=3, name= , birthday=2017-05-03 17:43:05}], 
roles=[{id=1001, name=chunlynn, title=admin}, {id=1002, name=jeff, title=vistor}]}
        retMap2 == > {users=[{id=1, name= , birthday=2017-05-03 17:43:05}, {id=2, name= , birthday=2017-05-03 17:43:05}, {id=3, name= , birthday=2017-05-03 17:43:05}], 
roles=[{id=1001, name=chunlynn, title=admin}, {id=1002, name=jeff, title=vistor}]}
        retMap3 == > {users=[{id=1, name= , birthday=2017-05-03 17:43:05}, {id=2, name= , birthday=2017-05-03 17:43:05}, {id=3, name= , birthday=2017-05-03 17:43:05}], 
roles=[{id=1001, name=chunlynn, title=admin}, {id=1002, name=jeff, title=vistor}]}
         */
    }
}

TypeToken 的构造方法是 protected 修饰的,所以上面才会写成new TypeToken>(){}.getType()  而不是 new TypeToken>().getType()  。


情况3 :Java Map高级的序列化与反序列化

★ Map的key为复杂对象形式

Map的存储结构式Key/Value形式,Key 和 Value可以是普通类型,也可以是自己写的JavaBean(本节),还可以是带有泛型的List(上节)。

实体类: 
      
      
      
      
public   class  Point {
    private int x;
    private int y;
    public Point(int x, int y) {
        super();
        this.x = x;
        this.y = y;
    }
// , getter setter 、toString
}

테스트 클래스:
package  com.chunlynn.gson;
import java.util.LinkedHashMap;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
public class GsonTest11 {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder()//
                //.setPrettyPrinting()// ( )
                .enableComplexMapKeySerialization() //// Map key
                .create();
        /**
         * [9] MapObject>Map key String
         */
        Map<String, Point> map1 = new LinkedHashMap<String, Point>();
        map1.put("a", new Point(3, 4));
        map1.put("b", new Point(5, 6));
        String jsonStr1 = gson.toJson(map1);
        System.out.println(" Map  ===》 " + jsonStr1);
        //  Map  ===》 {"a":{"x":3,"y":4},"b":{"x":5,"y":6}}
        Map<String, Point> retMap1 = gson.fromJson(jsonStr1, new TypeToken<Map<String, Point>>() {
        }.getType());
        for (String key : retMap1.keySet()) {
            System.out.println("key=" + key + ", values=" + retMap1.get(key));
        }
        //key=a, values=Point [x=3, y=4]
        //key=b, values=Point [x=5, y=6]
        /**
         * [10] Map<Object,String> ,Map key
         */
        Map<Point, String> map2 = new LinkedHashMap<Point, String>();
        map2.put(new Point(7, 8), "c");
        map2.put(new Point(9, 10), "d");
        String jsonStr2 = gson.toJson(map2);
        System.out.println("Map key Map  ===》 " + jsonStr2);
        //Map key Map  ===》 [[{"x":7,"y":8},"c"],[{"x":9,"y":10},"d"]]
        Map<Point, String> retMap2 = gson.fromJson(jsonStr2, new TypeToken<Map<Point, String>>() {
        }.getType());
        for (Point pKey : retMap2.keySet()) {
            System.out.println("key=" + pKey + ", values:" + retMap2.get(pKey));
        }
        // key=Point [x=7, y=8], values:c
        // key=Point [x=9, y=10], values:d
    }
}

맵, 리스트 범 형의 완결.


이 시리즈 의 기타 문장

JSON 분석 라 이브 러 리 의 Gson (1) - 간단 한 자바 빈 대상, 범 형 Bean 대상 과 JSON 상호 전환
JSON 분석 라 이브 러 리 의 Gson (2) - 범 형 대상 맵, List 와 JSON 문자열 의 상호 전환
JSON 해석 라 이브 러 리 의 Gson (3) --- Gson 주석
JSON 분석 라 이브 러 리 의 Gson (4) - TypeAdapter 연결 직렬 화 와 반 직렬 화 (상)
---------------------------------------------------------------------------------------------------
저작권 성명: 본 고 는 블 로 거 (chunlynn) 의 오리지널 글 입 니 다. 전재 할 때 출처 를 밝 혀 주 십시오.http://blog.csdn.net/chenchunlin526/article/details/71173404

좋은 웹페이지 즐겨찾기