原创

序列化反序列时精度丢失的避坑说明

1. 背景

在双方通过HTTP网络协议进行数据交互时,发送方往往会将Json对象数据序列化为字符串(ObjectMapper.writeValueAsString(Object value)),而接收方也往往会将接收到字符串数据反序列化为Json对象(ObjectMapper.readValue(String content, Classe valueType))。其中,当Json对象内出现数值类型,接收方在readValue时,数值字段会出现科学计数法与精度丢失问题。 只要涉及到序列化和反序列化的框架都可能出现该问题,以下使用jackson框架作为演示讲解。

2. 场景复现

a. 当数值类型是浮点数且达到千万级别时,字符串转Json对象会出现科学计数法问题 b. 当数值类型是浮点数且以“0”结尾时,字符串转Json对象会“抹0”问题

3. 解决方案

交互双方约定数值类型的数据也采用字符串传输,字符串传输不存在以上两种问题。 针对出现科学计数法问题,可对ObjectMapper开启反序列功能的USE_BIG_DECIMAL_FOR_FLOATS配置,该配置默认是关闭的。 配置:
 private static mapper;
 static{
 mapper = new ObjectMapper();
 mapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
 }
验证: 针对精度丢失("抹0")问题,同样也可以开启配置
正文到此结束
Loading...