这是我的例子:
class MyController {
def index() {
JSONObject json = request.JSON
log.info('{}', json)
respond json
}
}
如何处理json中的BigInteger?像这样:
curl -H 'content-type: application/json' -d '{"largeNum": 99999999999999999999999}' http://localhost:8080/
JSONObject会像这样将largeNum
转换为Double
:
{"largeNum":9.999999999999999E22}
但是我想获得一个BigInteger,怎么办?
答案 0 :(得分:0)
问题出在Grails JSON实现内部。
request.JSON
调用grails.converters.JSON
,后者依次使用org.grails.web.json.JSONTokener
类来解析输入。
重要的代码格式org.grails.web.json.JSONTokener#nextValue
为:
try {
return Integer.valueOf(s);
} catch (Exception e) {
try {
return Long.valueOf(s);
} catch (Exception f) {
try {
return Double.valueOf(s);
} catch (Exception g) {
return s;
}
}
}
这将导致精度损失,并且无法更改行为, 因为此标记生成器是在自定义编组器起作用之前使用的。
该代码取自grails 3.3.0
。我不知道那是从那以后。
关于JSON数字:
如果没有具体的格式,Java中的大多数json解析器会将json编号视为BigDecimal
,因为json编号没有限制,并且BigDecimal
是唯一可以正确表示的Java类型-请参见JSON Spec
这似乎很尴尬,因为JSON代表Java脚本对象表示法,而Javascript无法处理这些数字。
答案 1 :(得分:0)
谢谢你们。我推销公关来解决此问题:https://github.com/grails/grails-core/pull/11334
等待上游被合并。