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")问题,同样也可以开启配置