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