gpt4 book ai didi

json - 如何在Grails Controller 中处理在JSONObject中发布BigInteger?

转载 作者:行者123 更新时间:2023-12-02 15:42:15 25 4
gpt4 key购买 nike

这是我的示例:

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,怎么办?

最佳答案

问题出在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;
}
}
}


这将导致精度损失,并且无法更改行为,
因为此标记生成器是在自定义编码器起作用之前使用的。

我想到的唯一解决方案是使用 GSONJackson

该代码取自 grails 3.3.0。我不知道那是从那以后。

关于JSON数字:
如果没有具体的格式,Java中的大多数json解析器会将json编号视为 BigDecimal,因为json编号没有限制,并且 BigDecimal是唯一可以正确表示的Java类型-请参见 JSON Spec

这似乎很尴尬,因为JSON代表Java脚本对象表示法,而Javascript无法处理这些数字。

关于json - 如何在Grails Controller 中处理在JSONObject中发布BigInteger?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56160624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com