【Fastjson】double接收问题

277 阅读2分钟

问题描述

2022-11-23 20:54:53.470 [http-nio-8082-exec-3] INFO  cn.wsdy.haijing.util.api.BaseReq:21 - body:{ "_id" : { "doc" : "D3789DFC697A486B822B19952731706D", "sbjID" : 805306378 }, "data" : { "result" : { "count" : 1, "envirCount" : 0, "componentCount" : 0, "items" : [ { "time" : "2020-06-21 00:00:00", "data" : [ { "id" : 67108874, "name" : "湖泊2", "type" : "零维要素", "z" : 3.6082492876048073427 }, { "id" : 67108875, "name" : "湖泊1", "type" : "零维要素", "z" : 3.6108431003540886195 }, { "id" : 100663296, "name" : "湖泊河2", "type" : "一维河道要素", "count" : 6, "data" : [ { "index" : 0, "name" : "湖泊河2-0", "Z" : 3.610447363189884129, "Qin" : -2.4141860304334841203, "Qout" : -2.4141860304334841203, "Zi" : 3.6127972627812572348, "Zo" : 4.0, "A" : 144.99719315949781162, "B" : 67.240855821385295599, "V" : -0.016649881130994477474 }, { "index" : 1, "name" : "湖泊河2-1", "Z" : 3.6104527427778601023, "Qin" : -2.4133221852825954556, "Qout" : -2.4133221852825954556, "Zi" : 3.612764900956813463, "Zo" : 4.0, "A" : 256.22690878653406799, "B" : 84.114475082584704069, "V" : -0.0094186914118890036757 }, { "index" : 2, "name" : "湖泊河2-2", "Z" : 3.6103976420584622531, "Qin" : -2.4110645951768674422, "Qout" : -2.4110645951732294634, "Zi" : 3.6148607915563637505, "Zo" : 4.0, "A" : 70.228132944373726332, "B" : 27.534055374676935202, "V" : -0.03433189085466624435 }, { "index" : 3, "name" : "湖泊河2-3", "Z" : 3.6103857757704456155, "Qin" : -2.4106451540028501768, "Qout" : -2.4106451540028501768, "Zi" : 3.615632608162373085, "Zo" : 4.0, "A" : 67.714549027913236046, "B" : 26.514697393670854098, "V" : -0.035600106455839143627 }, { "index" : 4, "name" : "湖泊河2-4", "Z" : 3.6104235527471346678, "Qin" : -2.4094275928291608579, "Qout" : -2.4094275928291608579, "Zi" : 3.6156351835198425881, "Zo" : 4.0, "A" : 215.70017752276007172, "B" : 64.226597612800489401, "V" : -0.011170262447164304095 }, { "index" : 5, "name" : "湖泊河2-5", "Z" : 3.6103877546312190816, "Qin" : -2.4076995359027932864, "Qout" : -2.4076995359027932864, "Zi" : 4.0, "Zo" : 4.0, "A" : 96.321994829515460879, "B" : 32.109096811856602471, "V" : -0.024996362878118197348 } ]}
2022-11-23 20:54:53.478 [http-nio-8082-exec-3] ERROR c.w.haijing.controller.base.BaseExceptionHandler:33 - For input string: "-2.0089457919266330204E-15E-15"
java.lang.NumberFormatException: For input string: "-2.0089457919266330204E-15E-15"
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
	at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
	at java.lang.Double.parseDouble(Double.java:538)
	at com.alibaba.fastjson2.JSONReader.getNumber(JSONReader.java:2295)

一开始以为是double太长了在JSONObject.parseObject转换的过程中变成了科学计数法然后报错,类似于这个issue里面描述的问题 github.com/alibaba/fas…

但是这个issue里面数值也是可以显示的,而我遇到的问题则是报错无法正常运行,所以用Postman测试接口,使用报错值的前半部分在结果中进行检索-2.0089457919266330204 得到检索结果: image.png

写一段代码复现一下问题

String json = "{"V":-2.0089457919266330204e-15";
JSONObject jsonObject = JSONObject.parseObject(json);
System.out.println(jsonObject);

果然报了一样的错

image.png 原来问题出在源数据!

感觉像是科学计数法转换了两次,具体问题的原因我还没想明白,希望有懂的可以在评论区解答一下~

解决方案

先想下解决办法吧,主要是想到以下三种解决方案:

解决方案一: 让接口提供者使用String的方式传递数值

解决方案二: Fastjson改接收映射关系,double->string

网上查询到的解决方案是使用fastjson在com.alibaba.fastjson.serializer包下面提供了多种数据类型转换的注解。通过实现ObjectSerializer接口来拓展注解。

但是在FASTJSON2中ObjectSerializer 和 ObjectDeserializer 被移除了,FASTJSON v2中有比较完善的扩展机制,如下:

查阅了相关文档之后,得到解决方案

解决方案三: 使用对象作为序列化返回值,不使用JSONObject作为返回值

对象太复杂了

解决方案四: 降级为老版本

解决了。。。。

提了个issue,等待一下回复吧

小结

慎用新版本