¿Cómo utilizar variables en nombres clave en Groovy?
El truco de Cómo utilizar una variable para la parte clave de un mapa no funciona para lo siguiente.
¿Cómo hacer que funcione?
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 = x."(userNameKey)" // Accesses "users[0].name"
println "First user's name: ${firstUserName}"
def appVer = x."$appVersionKey" // Accesses "settings.app.version"
println "App version: ${appVer}"
Por cierto, para los curiosos, la "solución" anterior proviene de Google Gemini.
Aceptado
Inseguro pero la forma más fácil de evaluar la expresión dinámica - Eval.me
def x = [
users:[
[name:'Alice', age:30],
[name:'Bob', age:25]],
settings:[app:[name:'ExampleApp', version:'1.0.0']]
]
def userNameKey = "ROOT.users[0].name"
def appVersionKey = "ROOT.settings.app.version"
def firstUserName = Eval.me("ROOT", x, userNameKey)
println "First user's name: ${firstUserName}"
def appVer = Eval.me("ROOT", x, appVersionKey)
println "App version: ${appVer}"
huellas dactilares:
First user's name: Alice
App version: 1.0.0
Esta opción no es segura porque si la expresión de evaluación es proporcionada por un tercero, podrían leer/escribir casi cualquier cosa desde su sistema...
opción 2: usar jsonpath
lea más sobre jsonpath sysntax aquí: https://github.com/json-path/JsonPath
@Grab(group='com.jayway.jsonpath', module='json-path', version='2.9.0')
import com.jayway.jsonpath.JsonPath
def x = [
users:[
[name:'Alice', age:30],
[name:'Bob', age:25]],
settings:[app:[name:'ExampleApp', version:'1.0.0']]
]
def userNameKey = '$.users[0].name'
def appVersionKey = '$.settings.app.version'
def xJPath = JsonPath.parse(x)
def firstUserName = xJPath.read(userNameKey)
println "First user's name: ${firstUserName}"
def appVer = xJPath.read(appVersionKey)
println "App version: ${appVer}"