2011-11-20 8 views
9

He encontrado varias respuestas que están cerca de lo que estoy tratando de hacer, pero no lo suficiente como para haber podido hacerlo funcionar. Tengo un montón de JSON que se parece a este ejemplo (solo en realidad varios niveles más profundos y con cientos de elementos en el nivel al que quiero acceder): {"query":{"pages":{"links":[{"word":"bobsyeruncle","code":4},{"word":"easyaspie","code":3}]}}}. No puedo cambiar el formato; es la API de otra persona. Hay bastante de esto que no necesito; de hecho, solo quiero algo como una matriz de ["bobsyeruncle", "easyaspie"]. (O una lista o lo que sea)Recuperar cadenas de la matriz JSON utilizando Jackson

Experimenté con una versión más simple de JSON que no tenía una matriz, y pude acceder a una sola cadena fácilmente usando rootNode.get ("query"). Get ("páginas") ... forma descrita en https://stackoverflow.com/questions/338586/a-better-java-json-library/338608#338608. Pero no he podido llegar a la matriz de esa manera. La mayoría de las respuestas que he encontrado aquí asumen que quiero crear un POJO como "Enlaces" que incluye tanto "palabra" como "código", cosa que no hago. Para acceder a las cadenas que quiero, ¿es necesario crear algo así como una lista de "Enlaces" que incluya tanto "palabra" como "código" y luego ignorar "código"? Eso no parece correcto.

(Además, si alguien me podría apuntar a la documentación/tutoriales en algún lugar entre el tutorial JacksonInFiveMinutes y todo el javadoc, estoy seguro de que eso ayudaría también.)

ETA esto funcionó, creo !:

  String theJsonString = "{\"query\":{\"pages\":{\"links\":" 
       + "[{\"word\":\"bobsyeruncle\"},{\"word\":\"easyaspie\"}]}}}"; 
     ObjectMapper mapper = new ObjectMapper(); 
     JsonNode rootNode = mapper.readTree(theJsonString); 
     JsonNode interestingObjectNode = rootNode.path("query").path("pages").path("links"); 
     for (int i = 0; i < interestingObjectNode.size(); i ++) { 
      System.out.println(interestingObjectNode.get(i).path("word").asText()); 
     } 

Respuesta

7

Quizás el mensaje de este blog podría ayudar: Traversing JSON trees with Jackson?

No estoy seguro de cuál es el problema exacto que tiene, pero una cosa a tener en cuenta es que las matrices JSON se cruzan al pasar el índice de entrada, NO el nombre. Entonces, mientras que usaría objectNode.get("key"), usa arrayNode.get(0) en su lugar. O, si quiere jugar seguro y permitir entradas "perdidas", use arrayNode.path(0) (y lo mismo para Objetos JSON).

Recuerde también que puede volver entre JSON Trees (JsonNode) y POJOs; ObjectMapper tiene varios métodos para convertir representaciones (convertValue(), readAsTree(), treeToValue(), valueToTree()). Por lo tanto, es posible utilizar el enlace de datos para algunas partes, el modelo de árbol para otras; a veces vinculando subárboles como POJO, otras veces solo vinculando datos de alto nivel y accediendo a subárboles usando el modelo de árbol. Esta es una forma muy poderosa de hacer las cosas, pero lleva un tiempo acostumbrarse.

Espero que esto ayude!

+0

Eliminado mi comentario anterior - Llegué allí, coloque algún código arriba en caso de que alguien encuentre esta pregunta. – umbraphile

+0

¿Seguro? ¿Qué quieres decir con "Seguro" en ese uso de jackson? @StaxMan – gumuruh

+0

Seguro significa que si usa 'get' y no hay ningún nodo coincidente, devuelve null y debe estar marcado. Pero con 'ruta', se devuelve un "nodo faltante" virtual, por lo que no se necesitan verificaciones nulas. – StaxMan

0

En el GSON de Google, si crea un POJO que carece de algunas propiedades, se ignora el correspondiente JSON. Solo rellena las propiedades que tienen nombres coincidentes. Por qué no crear una clase como esta:

Query{ 
Pages{ 
Word[] Links; 
} 
} 

Word{ 
String word; 
String code; 
} 

y luego usar LambdaJ evitar escribir todos los bucles para que las palabras?

Si eso no es atractivo aspecto here y tratar JSONPath

Las porciones de bases de datos de documentos por ahí como MongoDB y RavenDB etc usar JSON como formato para el almacenamiento. La consulta de JSON complejo está integrada en ellos, utiliza las mismas bibliotecas que están utilizando.

+1

Deja un comentario con por qué estás dando voto negativo? Si se trata del código, obviamente es un pseudocódigo que explica la composición de varias clases de POJO. – Zasz

+0

La pregunta original indicaba que el uso de las definiciones de POJO no era deseable, por lo que tal vez solo mejore la redacción para sugerir que, en lugar de su enfoque, ¿aún considere el enlace de datos?(lo mismo ocurre con el uso de jackson vs gson) – StaxMan

Cuestiones relacionadas