Gson使用踩坑(json)

简单记录一下,要睡觉啦

工具类部分代码

public class JSONUtil {
    private static final Gson GSON = new Gson();

    // 静态调用, T是简单类型
    public static <T> T fromJson(String json, Class<T> clz) {
        return GSON.fromJson(json, clz);
    }

    public static String toJsonStr(Object obj) {
        return GSON.toJson(obj);
    }

    public static <T> T fromJson(String json, TypeToken<T> tt) {
        return GSON.fromJson(json, tt.getType());
    }
}

实体类

public class Father {

    private int a = 5;
    private String b = "b";
    private transient List<Integer> c = new ArrayList<>();

    @Override
    public String toString() {
        return "Father{" +
                "a=" + a +
                ", b='" + b + '\'' +
                ", c=" + c +
                '}';
    }
		
		// 为证明与构造无关,这里无参有参的都提供
  	public Father(int a, String b) {
        this.a = a;
        this.b = b;
        c.add(5);
    }

  	public Father() {    }

}

测试代码

    public static void main(String[] args) {
        Father f = new Father(1, "b");
        String s = JSONUtil.toJsonStr(f);
        System.err.println(s);
        Father o = JSONUtil.fromJson(s, Father.class);
        System.err.println(o);
    }

输出结果

{“a”:1,“b”:“b”}
Father{a=1, b=‘b’, c=null}

当把字段c上的关键字transient去掉时,结果如下:

{“a”:1,“b”:“b”,“c”:[5]}
Father{a=1, b=‘b’, c=[5]}

还有很多测试代码,懒得贴了,自己去尝试验证吧

结论如下:
使用transient修饰某个属性时,gson在创建此对象实例时,会将此字段赋空,该过程发生在类的初始化之后。所以,即使类初始化过程中对该字段进行了赋值也是无效的。


版权声明:本文为java_lifeng原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。