使用 GPath 深度遍历字符串中带有点的 Groovy 对象的方法

Sco*_*ott 6 grails groovy mongodb gpath

我遇到的情况是,我正在使用字符串查询 MongoDB,以查找对象层次结构中超过一级深度的字段。此查询必须是字符串。例如,我在 Groovy 中查询类似的内容:

def queryField = 'a.b.c'  //this is variable and can be different every time
def result = mongodb.collection.findOne([queryField:5])
Run Code Online (Sandbox Code Playgroud)

问题不会出现,在结果中我想找到嵌套字段的值。有了 GPath,我可以深入一层并获得 a 的值

def aObj = result."a"  //or result["a"]
Run Code Online (Sandbox Code Playgroud)

然而,我想通过做这样的事情来更深入:

def queryField = "a.b.c"       //this can change every time and is not always 'a.b.c'
def cObj = result[queryField]  //since field is variable, can't just assume result.a.b.c
Run Code Online (Sandbox Code Playgroud)

目前这在 Groovy 中不起作用。这里记录了一个错误,但我想知道是否有更好的解决方法可以用于这种情况,它比我通过在点上拆分来解析字符串然后构建对象遍历要干净一些。请注意,“abc”在运行时是可变且未知的(例如,它可能是“abd”)。

Phu*_*ong 4

根据错误/线程,支持点属性访问器似乎存在一些模糊问题。根据邮件列表线程,评估 queryField 字符串似乎是您最好的选择:

def result = [a: [b: [c: 42]]]
def queryString = 'a.b.c'

def evalResult = Eval.x(result, 'x.' + queryString)
assert evalResult == 42
Run Code Online (Sandbox Code Playgroud)

Groovy Web 控制台上的脚本

邮件列表线程有点旧,所以有一个新的(至少从 1.7.2 开始)Eval 类可以帮助运行没有大绑定的小片段。

否则,您可以拆分字符串并递归地对对象进行属性评估,从而有效地再现 GPath 遍历行为的子集。