Gson将json转Map 浮点型数据精度丢失问题
今天是1024节,写篇博客纪念下(其实就是想点亮1024勋章,哈哈哈),想到前段时间做flink的数据采集遇到的json转换数值精度问题导致消费端数据转换异常
逻辑很简单,就是要将一段json格式的报文转成map,随手用了Gson来转换:
Map map = gson.fromJson(mapJson,Map.class);
报文中的value值是整型(比如1024),但是转换完就变成了1024.0,这样就导致了消费端转Long型的过程中报数据转换异常,
所以对于整型数值的用Gson不行,试了下用fastjson转换:
Map map = (Map)JSON.parse(mapJson);
结果输出1024,保留原样输出?如果是float类型的数据呢?又试了下,发现1024.0用fastjson转换完变成了1024,小数点丢失了,接着用Gson转换精度没有丢失,浮点型用Gson转换没问题。
大家在遇到json报文解析的时候,根据自己的业务需要来选择不同的方式,那么如果既有int型又有float型数据怎么办?
Gson支持添加自定义解析方案,可以使用GsonBuilder的registerTypeAdapter和registerTypeHierarchyAdapter。前者只针对设置的类进行序列化及反序列化,后者可以对设置的类及其子类进行序列化。可以添加的解析类的类型包括JsonSerializer、JsonDeserializer和TypeAdapter这三个接口的实现类。下面是一个使用自定义的JsonDeserializer方案:
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;public class GsonDoubleInteger {public static Gson getGson() {Gson gson = new GsonBuilder().registerTypeAdapter(HashMap.class, new JsonDeserializer<HashMap>() {@Overridepublic HashMap<String, Object> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {HashMap<String, Object> resultMap = new HashMap<>();JsonObject jsonObject = json.getAsJsonObject();Set<Map.Entry<String, JsonElement>> entrySet = jsonObject.entrySet();for (Map.Entry<String, JsonElement> entry : entrySet) {resultMap.put(entry.getKey(), entry.getValue());}return resultMap;}}).create();return gson;}@SuppressWarnings("unchecked")public static void main(String[] args) {String flink = "{ fa: 1024, fb: 1024.0 }";HashMap<String, Object> map = getGson().fromJson(flink, HashMap.class);System.out.println(map);}
}
执行结果:
是不是很完美,以后遇到类似的报文解析或者接口验签等对数据准确性要求比较高的就可以用该方法!
今天是1024节,祝所有的程序员小哥哥小姐姐们节日快乐!
Gson将json转Map 浮点型数据精度丢失问题相关推荐
- 使用Gson解析Json为Map对象探索(上)
使用Gson解析Json为Map对象探索(上) 有些时候由于后台业务系统的不一样导致一个Json的list对象装的并非是同一种类型的对象,导致无法建立比较好的Java模型,而刚好可以利用map对象的通 ...
- 使用Gson解析Json为Map对象探索(下)
使用Gson解析Json为Map对象探索(下) 下面来说说其中出现的问题 1.如何获取一个list列表 1.1首先是数据格式 1.2处理成列表的代码 com.google.gson.Gson gson ...
- Gson应用:利用map和list来拼装Json消息
Gson应用:利用map和list来拼装Json消息 1 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import ja ...
- Json转换利器Gson之实例四-Map处理(下)
Map的存储结构式Key/Value形式,Key 和 Value可以是普通类型,也可以是自己写的JavaBean(上一篇博客),还可以是带有泛型的List(本文).本例中您要重点看如何将Json转回为 ...
- Java JSON转Map fastjson、gson、jackson、效率测试对比
测试Java中json字符串转map的效率, 1,使用的json字符串: 40个键值对:50个键值对 = 1:1 = 66986 x 2 = 133972个json, 每个json的key字符串长度= ...
- gson解析json maven_Gson解析Json
Json(JavaScript Object Notation)是一种轻量级的数据交换格式,类似XML,但比XML更小更快更容易解析.当前各种流行的web应用框架都对Json提供良好的支持,各种流行开 ...
- java中gso是什么意思_Java中用Gson解析json字符串
本文最后更新于2019年9月13日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢! =Start= 缘由: 因为阿里开源的fastjson前段时间爆出的漏洞实在是太多了(而且有些漏洞他 ...
- Gson将字符串转map时,int默认为double类型
gson能够将json字符串转换成map, 但是在转成map时, 会默认将字符串中的int , long型的数字, 转换成double类型 , 数字会多一个小数点 , 如 1 会转成 1.0 Gs ...
- 通过输入流获取的xml格式字符串转为json和map格式
通过输入流获取的xml格式字符串转为json和map格式 xml格式字符串转json格式代码: try {//通过输入流获取xml格式字符串数据ServletInputStream inputStre ...
最新文章
- 利用NVIDIA NGC的TensorRT容器优化和加速人工智能推理
- 运维企业专题(1)HTTP加速器——Varnish缓存机制前篇
- 解决jre生成错误的问题
- python 短进程优先算法_黄哥Python:图深度优先算法(dfs)
- 如何高效排查系统故障?一分钱引发的系统设计“踩坑”案例
- 商业游戏美术成本已超1000万,研发门槛连续飙升,CP砸不起怎么办?
- leetcode 994.腐烂的橘子
- mysql cluster 宕机 恢复_mysql cluster 集群恢复不起来,还请大神赐教?报错-问答-阿里云开发者社区-阿里云...
- Drupal常用开发工具(一)——Devel模块
- 变更数据推送java_idea 团队成员修改工程后push推送
- 360浏览器清除缓存_手机微信内置浏览器缓存清理指南
- python编程入门指南-Python 入门指南
- c语言提示少分号,问什么C程序里总是提示缺少分号;,而明明有分号?
- SQL server脚本语句积累
- TextView 跑马灯效果
- java序号带圈_疯狂创客圈 -- Java 高并发社群
- Springboot 整合 kafka 实现消息的发布和订阅
- 记一次线上OOM问题分析与解决,涨知识了!
- 软件安装【持续更新ing】
- 室内定位 Wi-Fi指纹 深度神经网络keras
热门文章
- 会唱歌的棒棒糖3D展示效果,产品三维模型运用
- win10服务器系统要设置要密码是什么,Windows10系统登陆需要或取消登陆密码的设置方法...
- 2020年最好用的手机是哪一款_2020最值得入手的手机是哪一款_性能最好的手机前十名...
- 树莓派学习笔记——I2C设备载入和速率设置
- 本周大新闻|John Carmack从Meta离职,OPPO发布双目AR一体机仅38g
- 编程挑战之三角形的内切圆与外接圆
- Python操作三大主流数据库
- 英伟达遭公司董事减持:套现2843万美元 股价承压
- win10网络查看不到共享计算机,win10系统下网上邻居看不到其他共享电脑的4个解决方法...
- 物联网学习路线图(超详细自学路线)