Проблема в реализации 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 не может обрабатывать эти числа.