Gson系列1 --- Gson 序列化与反序列化 -- 简单对象序列化

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));
    }

}




猜你喜欢

转载自blog.csdn.net/sunrainamazing/article/details/80951944