json字符串转map(Json字符串转对象)

json字符串转map(Json字符串转对象)前言 日常开发中 与 json 打交道的机会很多 一般对象 json 转都不会出现什么问题 但是 json 转对象就有可能出现问题了 今天就来说说 json 转 map 导致 int 型转换成 double 的问题 之前解决过 long 型被转化成科学计数法的问题 所有就拿以前的公用方法 一个泛型工具类 直接将需求类型对象传入泛型就好了 然而事与愿违 int 成功的转换成 double 1 1 0 0 0 0 如上图所示

大家好,我是讯享网,很高兴认识大家。



前言:日常开发中,与json打交道的机会很多,一般对象json转都不会出现什么问题,但是json转对象就有可能出现问题了,今天就来说说json转map导致int型转换成double的问题

  • 之前解决过long型被转化成科学计数法的问题,所有就拿以前的公用方法,一个泛型工具类
 
  
讯享网
  • 直接将需求类型对象传入泛型就好了。

    讯享网
  • 然而事与愿违,int成功的转换成double,1->1.0、0->0.0,如上图所示

接下来的操作大家都知道了,借助于网络平台,于是乎找到几种解决方式,细心的我发现有人评论解决他们的问题,看来有戏啊【手动滑稽】

1、需要gson解析的类型 , 重写他的deserialize方法, 就是将其中json手动解析成map , 不对数据进行处理

讯享网
  • 经过实践,是可以转化成功,但是本着复用的思想,我把map替换成泛型,然后就不行,一脸蒙蔽;(问题暂时搁置一旁)

2、自定义TypeAdapter替代Gson默认的adapter(此处埋下伏笔【偷笑】)解决,自定义TypeAdapter如下:

 
   
  • 然后如法炮制,仍然固执的使用泛型,并将我们自定义的注册到gson上
讯享网
  • 等待结果中...,每错就是这么刺激,int一样会转化成double

  • 把泛型直接替换成目标对象类型,再试了试,证明是没问题的
 

上述方案的确是可以解决我的问题,但是却给我留下了疑问;本着知其然知其所以然的目的,觉得解决这些疑惑

  • 为什么传递泛型不行?
  • 为什么是把int转化成了double,而不是其他类型比如string?

1、关于泛型这里就要提到 泛型擦除,及泛型只在编译阶段有效,运行时就无效了

  • 跟踪源码会发现 TypeAdapter 就已经是一个泛型抽象类了
讯享网
  • 我在外层又传了一次泛型,运行时根本就不认识我传递的目标对象类型了
  • 在外层直接传递目标对象类型,这里我传递的是HashMap<String,Object>,可我完全正确的识别出来

  • 所以我这里的操作完全是符合泛型擦除,所以运行时代码根本不认识这是个什么东西,自然不回你达到我们想要的效果了

2、int转double,其实这是Gson在源码中故意为之的,其实不仅是int,long也会转化成double,接下来我们去寻找证据

  • 跟踪源码,走你 => 过程省略1000步,忽略字,我们会来到Gson下的这个地方
  • 这里处理Number型的adapter,除此之外还有
 
   
  • 其实这里就是在寻找与我们目标对象想匹配的类型,但是如果找不到相匹配的类型,就会去调用 ObjectTypeAdapter,继续跟踪,它终于要在这里正式寻找喜欢的适配器了【斜眼笑】

  • 咋们运气比较好,这 for (TypeAdapterFactory factory : factories) 里有40几个适配器,第二个就是我们寻找的 ObjectTypeAdapter
  • 它一看大家都是 T 就你跟我长得最像了,那就调用你了,于是乎就来到新世界
讯享网
  • 是不是跟我们之前自定义的adapter一模一样,这就是为什么我们要复写这个TypeAdapter,重点看下面
 
   
  • 只要是Number(包括int、long、float、double等)型,都会被强制转化成double,至于为什么这么做,因为这里所有的类型都可以转换成double,而反过来则不行。


小讯
上一篇 2025-06-11 07:28
下一篇 2025-04-19 15:43

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/200173.html