天天看点

json反序列化坑之类型转换异常背景场景重现问题

背景

表中有个feature字段,需要存入一些json格式数据的字符串。页面需要展示去获取该值,进行反序列化时发生了异常。										
           

场景重现

  • 测试代码:
    json反序列化坑之类型转换异常背景场景重现问题
    代码说明:
  • 向Map<Long,Long>结构的map中存放两个数据,都是Long类型的值。
    json反序列化坑之类型转换异常背景场景重现问题
    反序列化时的值,有的还是Long,有的变为Integer类型了。
    json反序列化坑之类型转换异常背景场景重现问题
    但是外层的map类型还是Map<Long,Long>。

问题

问题1:获取不到值

明明存放进去时是Long类型啊,现在取的时候是Integer类型了。很奇怪!

json反序列化坑之类型转换异常背景场景重现问题
json反序列化坑之类型转换异常背景场景重现问题
  • map里的key变为了Integer类型的1,用Long类型的1来获取肯定获取不到了。

问题2:类型转换异常

这里我们代码改动下,存放的数据增加一种key是Long longKey = Long.valueOf(Integer.MAX_VALUE)+1L;

value = 1L;的情况。

json反序列化坑之类型转换异常背景场景重现问题
json反序列化坑之类型转换异常背景场景重现问题
json反序列化坑之类型转换异常背景场景重现问题

解决办法:Long value3 = Long.valueOf(String.valueOf(resultMap.get(longKey)));

总结:

- 阿里fastjson在将整形的value值反序列化时,会根据值得具体长度生成不同的类型,一旦值超过Integer型的表达范围就
会反序列化成Long; 在Integer以内会反射为Integer。
- 还有啥的Double会反射为BigDecimal。
- 其实不用记,每次使用的时候留个心眼,断点看一下是什么类型,注意处理下就好了。