2012-06-16 24 views
7

Estoy escribiendo una aplicación Grails/Groovy y tengo un objeto JSON con un nombre "cadena" (ojal y widget de) dentro de las params miembro de que se puede cambio. Es decir, la próxima vez podría ser acme y zoom. Aquí está el JSON:JSON para groovy con JsonSlurper y desconocido "cadena"

def jx = """{ 
    "job": "42", 
    "params": { 
     "grommet": {"name": "x", "data": "y"}, 
     "widget": { "name": "a", "data": "b"} 
    } 
}""" 

Estoy tratando de encontrar la manera de obtener la cadena ojal. Código hasta ahora:

def dalist = new JsonSlurper().parseText(jx) 
println dalist.job  // Gives: 42 
println dalist.params // Gives: [grommet:[name:x, data:y], widget:[name:a, data:b]] 
println dalist.params[0] // Gives: null 

alguna idea de cómo conseguir el ojal cadena ? Iama seguirá golpeándome la cabeza contra la pared.

+0

IRB (principal): 001: 0> rand (3) + 1 => 1 los interwebs han hablado, Respuesta 1 es captada. gracias a todos. – rtfminc

Respuesta

9

La clave params en el objeto JSON se asocia con un objeto JSON, no una matriz, por lo que no se puede acceder a ella por el índice. JsonSlurper asigna objetos JSON a Groovy Maps, por lo que puede acceder al params por sus claves, que son cadenas, p. dalist.params.grommet, que le dará el mapa [name: 'x', data: 'y'].

Para acceder a las claves en el params puede hacer dalist.params.keySet(), que le dará la lista ['grommet', 'widget']. Si está interesado en simplemente saber params claves, eso debería hacer el truco. Si necesita obtener la cadena 'grommet' por alguna razón, puede hacerlo accediendo al primer elemento en esa lista, es decir, dalist.params.keySet()[0], pero no sé por qué querría saber eso. Y no estoy seguro si se garantiza que la primera clave de ese mapa siempre será 'grommet', ya que los objetos JSON no están ordenados por la especificación (de json.org: Un objeto es un conjunto desordenado de pares de nombre/valor), pero , a su vez, los mapas Groovy están pedidos (la implementación predeterminada es LinkedHashMap) ... así que supongo que el orden se conserva al analizar JSON en el mundo Groovy, pero trataría de no confiar en ese comportamiento en particular, jeje .

+0

Miré la aplicación de nuevo ya que pensé que devolvía Object (doh!) Y no vi que devolviera listas y mapas. Gracias por la respuesta. – rtfminc

4

Se Map ejemplo, Proveedores:

def params = dalist.params.entrySet() as List // entrySet() returns Set, but it's easier to use it as a List 
println params 
println params.size() 
println params[0] 
println params[0].key 
println params[0].value 
+0

Gracias! Esto funciona como yo quería. – rtfminc

2

Esto podría ayudarlo.

import groovy.json.JsonSlurper; 
def jx='{"job":"42","params":{"grommet":{"name":"x","data":"y"},"widget":{"name":"a","data":"b"}}}' 

def dalist = new JsonSlurper().parseText(jx) 

assert dalist.params.getClass().name == "java.util.HashMap"; 
assert dalist.params.size() == 2; 

def keys = dalist.params.collect{ a, b -> a}; // returns "[grommet, widget]" 
assert !!dalist.params.get("grommet") == true 
+0

Gracias, esto hace lo que pensaba que debería poder hacer. Ahora, ¿para cuál selecciono un cheque? Las tres respuestas en la marca. – rtfminc

+1

@rtfminc Puedes votar los tres y elegir uno aleatoriamente. –

+0

upvote all 3: tarea completa. – rtfminc

Cuestiones relacionadas