grails - gpathresult - Manera de atravesar profundamente un objeto Groovy con punto en cadena usando GPath
traverse xml groovy (1)
La situación que tengo es que estoy consultando MongoDB con una cadena para un campo que tiene más de un nivel de profundidad en la jerarquía de objetos. Esta consulta debe ser una cadena. Entonces, por ejemplo, estoy preguntando por algo como esto en Groovy:
def queryField = ''a.b.c'' //this is variable and can be different every time
def result = mongodb.collection.findOne([queryField:5])
El problema no surge que en el resultado quiero encontrar el valor del campo anidado. Con GPath podría ir a un nivel profundo y obtener el valor de una haciendo esto
def aObj = result."a" //or result["a"]
Sin embargo, quiero ir más allá de eso haciendo algo como esto:
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
Esto no funciona en Groovy en este momento. Hay un error registrado aquí , pero me preguntaba si hay un mejor trabajo para este escenario que sea un poco más limpio que el de analizar el hilo dividiéndolo en el punto y luego construyendo el recorrido del objeto. Tenga en cuenta que "abc" es variable y desconocido en tiempo de ejecución (por ejemplo, podría ser "abd").
Basado en el error / subproceso, parece que hay algunos problemas de ambigüedad al admitir un acceso de propiedad de puntos. Basado en el hilo de la lista de correo, parecería que evaluar la cadena queryField sería su mejor apuesta:
def result = [a: [b: [c: 42]]]
def queryString = ''a.b.c''
def evalResult = Eval.x(result, ''x.'' + queryString)
assert evalResult == 42
Script en la consola web Groovy
El hilo de la lista de correo está un poco viejo, por lo que hay una nueva clase de evaluaciones (por lo menos 1.7.2) que puede ayudar con la ejecución de pequeños fragmentos que no tienen un enlace grande.
De lo contrario, puede dividir la cadena y recursivamente hacer evaluaciones de propiedades en el objeto, reproduciendo efectivamente un subconjunto del comportamiento transversal de GPath.