使用 GPath 深度遍历字符串中带有点的 Groovy 对象的方法
Posted
技术标签:
【中文标题】使用 GPath 深度遍历字符串中带有点的 Groovy 对象的方法【英文标题】:Way to deep traverse a Groovy object with dot in string using GPath 【发布时间】:2012-02-29 02:30:07 【问题描述】:我遇到的情况是,我正在使用字符串查询 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 中不起作用。记录了一个错误here,但我想知道是否有更好的解决方法可用于这种情况,它比我通过在点上拆分然后构建对象遍历来解析字符串更干净。请注意,“a.b.c”在运行时是可变的并且是未知的(例如,它可能是“a.b.d”)。
【问题讨论】:
我的回答的后半部分有帮助吗? ***.com/a/6364388/6509 感谢@tim_yates,这正是我想要的,但无法从我对 SO 的查询中找到它。您推荐的两个(评估与字符串解析)中的哪一个。两者都在进行字符串解析,但我认为 eval 可能会慢一点。有什么想法吗? 我会选择注入方法,但如果你有带有点的属性,它的弹性会降低,例如:a.'some.var'.c
【参考方案1】:
基于错误/线程,支持点属性访问器似乎存在一些歧义问题。根据邮件列表线程,评估 queryField 字符串似乎是您最好的选择:
def result = [a: [b: [c: 42]]]
def queryString = 'a.b.c'
def evalResult = Eval.x(result, 'x.' + queryString)
assert evalResult == 42
Script on Groovy Web Console
邮件列表线程有点旧,所以有一个新的(至少从 1.7.2 开始)Eval 类可以帮助运行没有大绑定的小型 sn-ps。
否则,您可以拆分字符串并递归地对对象进行属性评估,从而有效地再现 GPath 遍历行为的子集。
【讨论】:
Ack,我没有看到来自 @tim_yates 的使用相同 Eval 类的评论。以上是关于使用 GPath 深度遍历字符串中带有点的 Groovy 对象的方法的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 验证请求过滤器字段,字段名称中带有点(句点)