如何在Groovy中用变量作为键名?现有方案失效求解决
解决Groovy中通过带路径/数组下标的字符串键访问嵌套Map/List的问题
Groovy中直接使用x."$pathKey"或x."(pathKey)"的方式无法解析包含数组下标(如users[0])和多层嵌套(如settings.app.version)的复合路径字符串,因为动态属性访问仅支持单一键名,无法识别路径表达式。以下是两种可行的解决方法:
方法1:使用动态求值(Eval.me)
通过Groovy的Eval.me方法可以直接执行路径表达式的字符串,快速获取嵌套值。注意:若路径字符串来自不可信外部输入,此方法存在代码注入风险,仅适用于可控场景。
def x = [users:[[name:'Alice', age:30], [name:'Bob', age:25]], settings:[app:[name:'ExampleApp', version:'1.0.0']]] println x def userNameKey = "users[0].name" def appVersionKey = "settings.app.version" // 动态求值获取嵌套值 def firstUserName = Eval.me('x', x, "x.${userNameKey}") println "First user's name: ${firstUserName}" def appVer = Eval.me('x', x, "x.${appVersionKey}") println "App version: ${appVer}"
方法2:手动解析路径表达式(安全可控)
手动拆分路径字符串,逐层访问Map或List的元素,避免动态求值的安全风险,适合生产环境使用。
def x = [users:[[name:'Alice', age:30], [name:'Bob', age:25]], settings:[app:[name:'ExampleApp', version:'1.0.0']]] println x def userNameKey = "users[0].name" def appVersionKey = "settings.app.version" // 自定义工具方法:解析路径并逐层访问 def getNestedValue(obj, path) { // 拆分路径:按.分割,同时保留[xxx]格式的下标部分 def pathParts = path.split(/(?=\[)|\./) def currentObj = obj pathParts.each { part -> if (part.startsWith('[')) { // 处理数组下标,提取数字并转换为整数 def index = part.substring(1, part.length() - 1).toInteger() currentObj = currentObj[index] } else { // 处理Map键或对象属性 currentObj = currentObj[part] } } return currentObj } // 调用工具方法获取值 def firstUserName = getNestedValue(x, userNameKey) println "First user's name: ${firstUserName}" def appVer = getNestedValue(x, appVersionKey) println "App version: ${appVer}"
两种方法对比
- 动态求值:代码简洁,实现快速,但存在安全风险,仅适用于内部可控的路径字符串。
- 手动解析:安全可控,可处理复杂路径场景,适合生产环境,尤其是路径来自外部输入的情况。
内容的提问来源于stack exchange,提问作者xpt
相关产品推荐
相关产品推荐

