一、简介
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。
Gson是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个JSON字符串转成一个Java对象(反序列化),或者反过来(序列化)。
二、使用
1、依赖管理
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.0</version>
</dependency>
2、JavaBean序列化/反序列化
//Java对象序列化为字符串
public String toJson(Object src);
//将jsonstr 反序列化为Java 对象
public <T> T fromJson(String json, Class<T> classOfT)
1、普通Java对象
Gson gson = new Gson();
Person person = new Person("zhangsan", 20, true);
String json = gson.toJson(person);//序列化成字符串
System.out.println("序列化成字符串:"+json);
Person person1=gson.fromJson(json,Person.class);
System.out.println("反序列化:"+person1);
2、Java数组对象
public static void testGsonaRRAY() {
Gson gson = new Gson();
Person person1 = new Person("zhangsan", 20, true);
Person person2= new Person("zhangsan", 20, true);
Person person3 = new Person("zhangsan", 20, true);
Person[] persons = new Person[3];
persons[0]=person1;
persons[1]=person2;
persons[2]=person3;
String s = gson.toJson(persons);
System.out.println("序列化:"+s);
Person[] people = gson.fromJson(s, Person[].class);
System.out.println("反序列化:"+people[0]);
System.out.println("反序列化:"+people[1]);
System.out.println("反序列化:"+people[2]);
}
3、List
对泛型集合,进行反序列化需要使用TypeToken设置类型
public static void testList(){
ArrayList<Person> arrayList = new ArrayList<>();
arrayList.add(new Person("zhangsan",20,false));
arrayList.add(new Person("zhangliu",21,false));
arrayList.add(new Person("zhangwu",22,false));
Gson gson = new Gson();
String s = gson.toJson(arrayList);
System.out.println("序列化:"+s);
Type type = new TypeToken<List<Person>>() {}.getType(); //泛型类型,import com.google.gson.reflect.TypeToken;
List<Person> list = gson.fromJson(s, type);
list.forEach(System.out::println);
}
Set 、Map集合类型
Type type = new TypeToken<Set<Person>>() {}.getType();
Set<Person> personSet= gson.fromJson(s, type); //反序列化
Type type = new TypeToken<Map<String, Person>>() {}.getType();
Map<String,Person> userMap2 = gson.fromJson(s, type);
4、变量值为null时的序列化/反序列化
如果一个变量的值为NULL,那么按照GSON默认的处理为忽略这个宁段
5、控制序列化/反序列化的变量名称
可以借助@SerializedName注解控制JSON字段中Key的命名。
如果希望指定GSON对某些字段配置是否参与序列化与反序列化可以使用@Expose注解控制,同时使用GsonBuilder创建Gson对象:
另外直接使用transient关键字修饰的变量,也可以让该变量不参与序列化/反序列化
三、GsonBuilder
GsonBuilder 构建 Gson
对于默认配置的 Gson,直接使用 new Gson 更简单,当需要设置默认值以外的配置选项时,使用 GsonBuilder 构建器,调用它的各种配置方法,最后调用 create 方法创建 Gson 对象。
//序列化空字段,默认情况下,Gson 序列化期间会忽略所有为 null 的字段
GsonBuilder serializeNulls();
//根据提供的模式序列化 Date 日期对象,可以多次调用,但只有最后一次调用将用于决定序列化格式。
GsonBuilder setDateFormat(String pattern);
四、JsonObject
1、JsonElement
Gson中Json对象的抽象类,代表着json串的某一个元素,元素可以为有JsonArray(json数组)、JsonObject(json对象)、JsonPrimitive(Java基本类型)、JsonNull(null)
2、JsonParser
将json字符串转化为JsonElement对象
//将jsonstr转化为JsonElement
public static JsonElement parseString(String json)
public static JsonElement parseReader(Reader reader)
public static JsonElement parseReader(JsonReader reader)
3、JsonPrimitive
Java基本类型
public static void testJsonObject2(){
Person person = new Person("zhangwu", 22, true);
Gson gson = new Gson();
String s = gson.toJson(person);
JsonObject jsonObject1 = gson.fromJson(s, JsonObject.class);
System.out.println(jsonObject1);
System.out.println("===========jsonParser==============");
JsonObject jsonObject2 = JsonParser.parseString(s).getAsJsonObject();
System.out.println(jsonObject2.get("gender").getAsBoolean());
Set<String> strings = jsonObject2.keySet();
for (String str:strings) {
System.out.println(jsonObject2.get(str));
}
JsonObject jsonObject3 = new JsonObject();
jsonObject3.add("person",jsonObject2);
System.out.println(jsonObject3.get("person"));
}