Gson使用踩坑(json)

这篇博客探讨了Gson库在序列化和反序列化时如何处理被`transient`关键字修饰的字段。实验结果显示,使用`transient`修饰的属性在反序列化时会被忽略,即使在类初始化中设置了值,也会变为null。这说明Gson在创建对象实例时不会考虑`transient`字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单记录一下,要睡觉啦

工具类部分代码

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在创建此对象实例时,会将此字段赋空,该过程发生在类的初始化之后。所以,即使类初始化过程中对该字段进行了赋值也是无效的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值