使用插值将字符串添加到带有变量的groovy映射中

时间:2018-11-16 14:48:33

标签: groovy

考虑代码:

 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 :(得分:3)

当在字符串中使用$替换其中的变量时,实际上并没有获得Java String,而是返回了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添加自己的序列化器,以防止此类混淆。