使用插值将字符串添加到带有变量的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会改变输出,从而使插值工作,但如果没有它,输出似乎是某种复杂类型。

当在字符串中使用$来替换其中的变量时,实际上并没有得到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添加自己的序列化程序可能是一个好主意,以防止出现这样的混乱。

最新更新