¿Cómo utilizar variables en nombres clave en Groovy?

Resuelto xpt asked hace 7 meses • 0 respuestas

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.

ingrese la descripción de la imagen aquí

xpt avatar Feb 17 '24 02:02 xpt
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}"
daggett avatar Feb 17 '2024 05:02 daggett