【发布时间】:2013-06-23 15:06:48
【问题描述】:
我看到了 javascript 中最奇怪的东西之一。 服务器端(spring):
@RequestMapping(value = "/foo", method = RequestMethod.GET)
@ResponseBody
public Long foo() {
return 793548328091516928L;
}
我返回一个 long 值并且:
$.get('/foo').done(function(data){
console.log(data);
});
它将长整数表示为“793548328091516900”,用 0 替换(实际上是四舍五入)最后两位数字。当我从任何浏览器的地址栏发出 GET 请求时,数字表示正确;因此,在我看来,这是一个 js 问题。
从服务器返回一个字符串而不是长字符串并使用:
var x = new Number(data).toFixed();
显然是一个解决方案。但我没那么幸运,我必须处理一个复杂的 POJO(转换为 JSON),它的一些字段(一些是嵌套的)是用 java.lang.Long 类型输入的。如果我尝试将此 POJO 强制转换为另一个没有 Long 类型字段的对象,这显然很麻烦。
有没有更清晰的方法解决这个障碍?
【问题讨论】:
-
值得注意的是,ECMAScript 规范的最新草案 (tc39.es/ecma262/#sec-bigint-objects) 现在有一个 BigInt 类型(尽管浏览器支持不稳定)。但是,JSON 还不支持 BigInts。所以现在真正的问题在于序列化/反序列化,而不是 JavaScript 本身。
标签: java javascript json spring integer