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



我遇到的情况是,我正在使用字符串查询MongoDB,以查找对象层次结构中一个以上级别的字段。此查询必须是字符串。例如,我在Groovy中查询这样的内容:

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

问题不在于,在结果中我想找到嵌套字段的值。有了GPath,我可以深入一个层次,通过这个获得a的价值

def aObj = result."a"  //or result["a"]

然而,我想更深入地做这样的事情:

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

这目前在Groovy中不起作用。这里记录了一个错误,但我想知道是否有更好的解决方案可以用于这种场景,它比我通过在点上拆分然后构建对象遍历来解析字符串更干净。请注意,"a.b.c"是可变的,在运行时是未知的(例如,它可能是"a.b.d")。

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

def result = [a: [b: [c: 42]]]
def queryString = 'a.b.c'
def evalResult = Eval.x(result, 'x.' + queryString)
assert evalResult == 42

Groovy Web控制台上的脚本

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

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

最新更新