Когда вы используете $
внутри строки для замены переменных в ней, вы на самом деле не возвращаете строку Java, а GString
. Тогда ваш сериализатор JSON просто сериализует это:
groovy:000> a=1
===> 1
groovy:000> s="$a"
===> 1
groovy:000> s.getClass()
===> class org.codehaus.groovy.runtime.GStringImpl
groovy:000> s.properties
===> [values:[1], class:class org.codehaus.groovy.runtime.GStringImpl, bytes:[49], strings:[, ], valueCount:1]
Использование .toString()
или приведение к String часто необходимо, когда потребители принимают любой объект, и это имеет значение. В зависимости от вашей JSON-библиотеки было бы неплохо добавить собственный сериализатор для GString, чтобы избежать путаницы, подобной этой.