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反序列化的正确性