根据键名取值时Map returns null

Map returns null when getting value based on key name

当在 Jenkins 管道中 运行 时,我有一个关于从 Grovvy 中的 LinkedHashMap 获取值的非常奇怪的问题。

我有一张这样的地图:map = ['key1': 'param1']

现在我想获取key1的值,所以调用map.get('key1')map['key1']。令人惊讶的是这两个 return null.

当我尝试调用 map.keySet() 时,它 returns key1。最有趣的是,当我按预期调用 map.get(map.keySet()[0]) 时,它 return param1

那么直接map.get('key1')怎么可能行不通呢?

更新:

经过一番调查,我发现 key1 不是字符串,而是 org.codehaus.groovy.runtime.GStringImpl。有人知道为什么它被转换为这个 class 而不是 String 吗?

初始地图是这样创建的:

result = ["${key}": value]

以下代码确实有效。

map = ['key1': 'param1']
assert 'param1' == map['key1']

问题更新后

密钥实际上不是字符串。 toString() 会给你字符串 String,可以用作键

GStrings (groovy.lang.GString) 在其他编程语言中也称为插值字符串。 "${key}" 是一个 GString,但 "${key}".toString() 是一个字符串。更多详情请见 here

以下方法可以解决您的问题

def key = 'key1'
def a = "${key}"  // or a = "${key}".toString()
def result = [:]
result[a] = 'param1'
println result.key1 // or result['key1']