Gson:GitHub 标星 18K 的 JSON 解析器,Google 出品的 Java JSON 解析器,强烈推荐

本文详细介绍了Gson库的使用,包括如何序列化和反序列化对象,处理混合类型,以及如何进行个性化定制。Gson库默认处理null值和注解,支持泛型,并提供GsonBuilder进行格式定制。对于混合类型列表,需要通过JsonParser解析。Gson还允许通过注解和修饰符来控制字段的序列化行为。
摘要由CSDN通过智能技术生成

2)不需要使用任何的注解来表明哪些字段需要序列化,哪些字段不需要序列化。默认情况下,包括所有的字段,以及从父类继承过来的字段。

3)如果一个字段被 transient 关键字修饰的话,它将不参与序列化。

4)如果一个字段的值为 null,它不会在序列化后的结果中显示。

5)JSON 中缺少的字段将在反序列化后设置为默认值,引用数据类型的默认值为 null,数字类型的默认值为 0,布尔值默认为 false。

接下来,来看一个序列化集合的例子。

List list =new ArrayList<>();

list.add(“好好学习”);

list.add(“天天向上”);

String json = gson.toJson(list);

结果如下所示:

[“好好学习”,“天天向上”]

反序列化的时候,也很简单。

List listResult = gson.fromJson(json,List.class);

结果如下所示:

[好好学习, 天天向上]

我女朋友是一个很细心也很贴心的人,在你调用 toJson() 方法进行序列化的时候,她会先判 null,防止抛出 NPE,再通过 getClass() 获取参数的类型,然后进行序列化。

public String toJson(Object src) {

if (src == null) {

return toJson(JsonNull.INSTANCE);

}

return toJson(src, src.getClass());

}

但是呢?对于泛型来说,getClass() 的时候会丢掉参数化类型。来看下面这个例子。

public class Foo {

T value;

public void set(T value) {

this.value = value;

}

public T get() {

return value;

}

public static void main(String[] args) {

Gson gson = new Gson();

Foo foo = new Foo();

Bar bar = new Bar();

foo.set(bar);

String json = gson.toJson(foo);

}

}

class Bar{

private int age = 10;

private String name = “图灵”;

}

假如你 debug 的时候,进入到 toJson() 方法的内部,就可以观察到。

foo 的实际类型为 Foo<Bar>,但我女朋友在调用 foo.getClass() 的时候,只会得到 Foo,这就意味着她并不知道 foo 的实际类型。

序列化的时候还好,反序列化的时候就无能为力了。

Foo foo1 = gson.fromJson(json, foo.getClass());

Bar bar1 = foo1.get();

这段代码在运行的时候就报错了。

Exception in thread “main” java.lang.ClassCastException: class com.google.gson.internal.L

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值