如何在Grails控制器中处理在JSONObject中发布BigInteger?

时间:2019-05-16 03:58:24

标签: json grails

这是我的例子:

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

2 个答案:

答案 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;
                    }
                }
            }

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

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

该代码取自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

等待上游被合并。