当前位置:网站首页 > Vue.js开发 > 正文

map转json字符串再转对象(map转换为jsonobject)



前言:日常开发中,与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 ,可我完全正确的识别出来

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

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,而反过来则不行。

到此这篇map转json字符串再转对象(map转换为jsonobject)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • vue路由跳转报错(vue3 路由跳转)2026-04-03 07:27:09
  • vue2转vue3(vue2转vue3很痛苦)2026-04-03 07:27:09
  • vue2和vue3区别(vue2和vue3区别diff)2026-04-03 07:27:09
  • 安装vue报错(vuex安装 报错)2026-04-03 07:27:09
  • pcie 4.0固态硬盘(pcie 4.0固态硬盘推荐)2026-04-03 07:27:09
  • map转json字符串(map转json字符串 空没有字段)2026-04-03 07:27:09
  • pcie5.0有什么用(pcie5.0什么时候上市)2026-04-03 07:27:09
  • pcie 4.0固态硬盘(pcie 4.0固态硬盘插到pcie3.0)2026-04-03 07:27:09
  • js深度拷贝和浅拷贝(js深拷贝和浅拷贝的方法)2026-04-03 07:27:09
  • ettercap下载和安装(ettercap 0.8.3教程)2026-04-03 07:27:09
  • 全屏图片