Добавление строки в шпунтовую карту с переменной с помощью интерполяции - PullRequest
0 голосов
/ 16 ноября 2018

Рассмотрим код:

 Map prJsonData = readJSON text: '{}'
 prJsonData.head = "release/${NEW_TAG}" as String
 prJsonData.title = "Release ${NEW_TAG}"
 writeJSON(file: 'create-pr.json', json: prJsonData, pretty: 4)

и вывод

{

    "head": "release/v1.0.2",

    "title":     {

        "bytes":         [
            82,
            101,
            97
        ],

        "strings":         [

            "Release ",

            ""

        ],

        "valueCount": 1,

        "values": ["v1.0.2"]

    }

}

Почему указание as String изменяет вывод так, что интерполяция работает, но без этого вывод выглядит как некий сложный тип.

1 Ответ

0 голосов
/ 17 ноября 2018

Когда вы используете $ внутри строки для замены переменных в ней, вы на самом деле не возвращаете строку 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, чтобы избежать путаницы, подобной этой.

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