Java 奇怪的spring boot中的长值舍入问题
当我尝试使用Jackson对象映射器将对象序列化为JSON时,它工作得非常好Java 奇怪的spring boot中的长值舍入问题,java,spring,spring-boot,jackson,Java,Spring,Spring Boot,Jackson,当我尝试使用Jackson对象映射器将对象序列化为JSON时,它工作得非常好 {"id":1291741231928705024,"uuid":null,"email":"kannanrbk.r@gmail.com"} 然而,当我尝试使用SpringREST控制器访问它时。长值数字四舍五入,最后3位 我阅读了stackoverflow中存在的问题,其中大多数建议将数据类型更改为string。但是我们在大多数地方
{"id":1291741231928705024,"uuid":null,"email":"kannanrbk.r@gmail.com"}
然而,当我尝试使用SpringREST控制器访问它时。长值数字四舍五入,最后3位
我阅读了stackoverflow中存在的问题,其中大多数建议将数据类型更改为string。但是我们在大多数地方使用了长值引用,更改数据类型将需要一些重构
我做了初步分析:
ObjectMapper
MappingJackson2HttpMessageConverter
curl
:
$curl本地主机:8080
{“id”:1291741231928705024,“uuid”:null,“email”:“kannanrbk。r@gmail.com"}
在这里,数字被正确序列化
Firefox中查看的相同json会截断:
但是,“原始数据”选项卡正确显示数字:
在JavaScript中,1291741231928705024不是安全整数(请参阅):
Number.isSafeInteger(1291741231928705024);
假的
该数字大于2^53-1
,因此会四舍五入。JavaScript中可能出现更令人困惑的情况:
>1291741231928705024==1291741231928705022
真的
可能的解决办法 首先,针对此类问题检查您的客户。如果它可以安全地反序列化这些数字,那么您就安全了 或者你可以将
long
s序列化为String
s(正如你在问题中提到的),这就是Twitter在文章中提出的:
为了允许Javascript和JSON解析器读取ID,Twitter对象在使用JSON响应时包含任何ID的字符串版本。因此,Twitter API中的状态、用户、直接消息、保存的搜索和其他ID在JSON响应中以整数和字符串的形式返回
请尝试将bigInt用作主键JSON没有整型数据类型。所有的数字都是实数。因此,大多数解析器用双精度表示JSON数字。解决方法:要么使用字符串,要么确保数字不会太大。
MappingJackson2HttpMessageConverter
使用Jackson2ObjectMapperBuilder
bean。您可以在某个地方插入Jackson2ObjectMapperBuilder,并使用它。使用plainnew ObjectMapper().readValue(…)
它可以工作,并且您的问题不可再现。@Vusal我尝试注入ObjectMapperBuilder,但问题仍然存在。我遗漏了什么吗?