如何使用字符串插值从 Groovy 中带有点符号的嵌套映射的 属性 中获取值

How to get a value from a property of a nested map with dot notation in Groovy using string interpolation

我从参数中收到一个以点表示的字符串,例如"attr1.attr2.attr3"。 我有一个数据类型为 LinkedHashMap<String, Object> mapObject 的对象。 它有一个可以通过这种方式访问​​的值:mapObject.attr1.attr2.attr3.

当我尝试以这种方式访问​​该字段时:mapObject."${attr1.attr2.attr3},我收到一个 MissingPropertyException,因为 groovy 将其转换为字符串:mapObject."attr1.attr2.attr3" 并且属性,显然,不存在。 我已经设法使用 Eval.java class Eval.x() 方法解决了这个问题: Eval.x(mapObject,"x.${attr1.attr2.attr3}"),但这对蜗牛来说也太慢了。

有没有一种方法可以让我只知道点标记路径就可以获取地图的嵌套 属性 的值?

这是我的代码:

def superCoolMethod(String dotNotatedPath, LinkedHashMap<String, Object> MapObject){
def valueINeedToGetFromTheMapObject = MapObject."${dotNotatedPath}"
// Other stuff unimportant for this question.

您可以在 . 上拆分路径(为正则表达式引用它)然后减少 在使用您的数据的路径上。例如

def data = [a: [b: [c: 42]]]
def path = "a.b.c"

println path.split(/\./).inject(data){ m, p -> m?.getAt(p) }
// → 42