Как обрабатывать пост BigInteger в JSONObject в контроллере Grails? - PullRequest
0 голосов
/ 16 мая 2019

Вот мой пример:

class MyController {

    def index() {
        JSONObject json = request.JSON
        log.info('{}', json)
        respond json
    }

}

Как мне справиться с BigInteger в json? как это:

curl -H 'content-type: application/json' -d '{"largeNum": 99999999999999999999999}' http://localhost:8080/

JSONObject преобразует это largeNum в Double следующим образом:

{"largeNum":9.999999999999999E22}

Но я хочу получить BigInteger, как?

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Спасибо, ребята. Я нажимаю пиар, чтобы решить эту проблему: https://github.com/grails/grails-core/pull/11334

Ожидание объединения вверх по течению.

0 голосов
/ 16 мая 2019

Проблема в реализации 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;
                    }
                }
            }

Это приведет к потере точности, и нет способа изменить поведение, потому что этот токенизатор используется до того, как в игру вступит пользовательский маршаллер.

Единственное решение, которое приходит мне в голову - это использовать GSON или Джексон .

Код был взят из grails 3.3.0. Я не знаю, было ли это с тех пор.

О номерах JSON: Без конкретного формата большинство парсеров json в java будут обрабатывать число json как BigDecimal, потому что числа json не имеют ограничений, и BigDecimal является единственным типом java, который представляет это правильно - см. JSON Spec

Это может показаться неловким, потому что JSON обозначает нотацию объектов Java Script, а Javascript не может обрабатывать эти числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...