JSON 분석 라 이브 러 리 의 Gson (2) - 범 형 대상 맵, List 와 JSON 문자열 의 상호 전환
170782 단어 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>>(); //// Mapmap2 = 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*/// ,MapType 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()
- >().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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
스마트 폰 버전 Qiita에서 새로운 기사를 만드는 버튼을 모르기 때문에 QiitaAPI를 사용하여 어떻게 하는지 테스트오랜만에 신규 기사를 쓰려고 하면, 「작성 버튼…어디?」가 되어 전혀 발견되지 않았기 때문에, QiitaAPI와 Shortcuts로 어떻게든 한 이야기. 사용할 수 있는 도구는 스마트폰만(PC는 사용하지 않는다) S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.