使用 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 验证请求过滤器字段,字段名称中带有点(句点)

PowerShell 中的环境变量,名称中带有点 (.)

简述深度优先搜索遍历的方法。

访问 ID 中带有点 (.) 的 bean

Vue.js 绑定到名称中带有点的 DOM 自定义事件(如引导事件)

FireDAC (FDQuery) - 名称中带有点的数据库