1、对于引用类型 和 基本类型 序列化时 (在默认值方面) 是不一样的
# QuickStart 因为 Gson 只有这一个 对外 公开的构造器, public Gson() { } 而其内部的属性皆是 final修饰的, 故 在已创建 new Gson() 所有的属性都会被初始化,且不可改变, 即 Gson 序列化和 反序列化 都是采用的 策略和规则 都是默认的行为。 而且 Gson 是 final修饰的类 , 不可被继承 ,被扩展 但是 可以通过 GsonBuilder 进行更改原始的默认配置 和 扩展一些额外的功能。 # Gson 序列化与反序列化 Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法, 前者实现反序列化,后者实现了序列化。 [new Gson() 序列化时] 1、 不序列化属性为 null的值, 若需要输出null或转换null值,则需要自定义转换规则 2、 对于基本类型 和 引用对象的序列化, 默认值的处理不同; 如 int 类型 若没有设置值,则默认值为 0, 则会序列化为 值为0 的json 而 Integer 类型 若没有设置值 ,则默认值为 null , 该属性不会被序列化 [new Gson() 反序列化时] 1、对于未知的json属性,则会忽略 2、设置了@Expose(deserialize=false)即使json中 包含 也会 被 忽略
2、相关案例
package sun.rain.amazing.gson.quickstart; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * 对于简单类的json化 * 基本类型 和 引用类型是不同的 * 因为 基本类型有默认值 如 int 默认值 为 0 * 而引用类型的默认值 都为 null * * 而默认的new Gson() 不序列化 属性值为 null 的字段 * * 若要输出null 则需要 new GsonBuilder() 来构造 * 相应的条件(即设置相应的属性) 进行输出 * * @author sunRainAmazing */ @Data @AllArgsConstructor @NoArgsConstructor public class GsonSimple { private String name; private String email; private String mobile; private int num; private Integer numNull; public GsonSimple(String name, String email) { this.name = name; this.email = email; } }
3、测试类
package sun.rain.amazing.gson.quickstart; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.junit.Test; /** * @author sunRainAmazing */ public class GsonSimpleTest { private Gson gson = new Gson(); /** * 测试完整的所有属性值 * 对于未知的属性 反序列化时 会 忽略此属性 * * {"name":"A","email":"B","mobile":"C1","num":10,"numNull":110} * gserSimple(name=A, email=B, mobile=C1, num=10, numNull=110) * gserSimple(name=A, email=B, mobile=C1, num=10, numNull=null) */ @Test public void testGsonSimple(){ GsonSimple gs = new GsonSimple("A","B","C1",10,110); // json 序列化 String json = gson.toJson(gs); System.out.println(json); // json 反序列化 GsonSimple u = gson.fromJson(json,GsonSimple.class); System.out.println(u); // 会 忽略未知的属性 mobiles(为额外的属性) String jsonx = "{\"name\":\"A\",\"email\":\"B\",\"mobile\":\"C1\",\"num\":10,\"mobiles\":\"Cs\"}"; u = gson.fromJson(jsonx,GsonSimple.class); System.out.println(u); } /** * new Gson * 默认的构造器 会 忽略 null -- 在后续的文章会详细介绍如何处理null值 * 如何自定义null值的序列化规则 * * {"name":"A","email":"B","num":0} * gserSimple(name=A, email=B, mobile=null, num=0, numNull=null) * * --- 会输出 null 值 * {"name":"A","email":"B","mobile":null,"num":0,"numNull":null} * */ @Test public void testGsonSimpleNull(){ GsonSimple gs = new GsonSimple("A","B"); // json 序列化 String json = gson.toJson(gs); System.out.println(json); // json 反序列化 GsonSimple u = gson.fromJson(json,GsonSimple.class); System.out.println(u); // 采用默认个数 处理输出 null 值 gson = new GsonBuilder().serializeNulls().create(); System.out.println(gson.toJson(gs)); } }