java 泛型 json_Java泛型与Json反序列化

Java的JSON库有很多,本文分析google的Gson和alibaba的fastjson,在Java泛型场景反序列化的一些有意思的行为。考虑下面的json字符串:

[

"2147483648",

"2147483647"

]

用fastjson在不指定类型的情况下解析,下面的代码输出啥:

JSON.parseArray(s).forEach(o -> { System.out.println(o.getClass()); });

答案是:

class java.lang.Long

class java.lang.Integer

是不是感觉有点儿奇怪,两个都是数字啊,居然输出了不同的类型,原因我们下面细讲。再看看Gson, 用Gson解析并且不指定泛型类型的话,下面的代码输出啥:

new Gson().fromJson(s, List.class).forEach(o -> { System.out.println(o.getClass()); });

答案是:

class java.lang.Double

class java.lang.Double

这次两个都是Double类型,明明是整数啊,为啥到Gson这里变成Double了?

我们试了两个Json库,解析相同的json字符串,得到全然不同的结果。如果在实际使用的时候,用这种方式反序列化JSON,很容易出现BUG,而且是运行时才可能出现,这种问题一旦出现往往很难排查。因此为了保证泛型类型Json反序列化的正确性

你可能感兴趣的:(java,泛型,json)