readtree node new jsonnode example convert java json jackson

java - node - Jackson JSON: obtener el nombre de nodo de json-tree



new jsonnode java (5)

Aclaración aquí:

Si bien esto funcionará:

JsonNode rootNode = objectMapper.readTree(file); Iterator<Map.Entry<String, JsonNode>> fields = rootNode.fields(); while (fields.hasNext()) { Map.Entry<String, JsonNode> entry = fields.next(); log.info(entry.getKey() + ":" + entry.getValue()) }

Esto no:

JsonNode rootNode = objectMapper.readTree(file); while (rootNode.fields().hasNext()) { Map.Entry<String, JsonNode> entry = rootNode.fields().next(); log.info(entry.getKey() + ":" + entry.getValue()) }

Así que tenga cuidado de declarar el Iterator como una variable y use eso

¿Cómo puedo recibir los nombres de nodo de un árbol JSON utilizando Jackson? El archivo JSON se ve así:

{ node1:"value1", node2:"value2", node3:{ node3.1:"value3.1", node3.2:"value3.2" } }

yo tengo

JsonNode rootNode = mapper.readTree(fileReader);

y necesita algo como

for (JsonNode node : rootNode){ if (node.getName().equals("foo"){ //bar } }

Gracias.


Esta respuesta se aplica a las versiones de Jackson anteriores a 2+ (originalmente escrito para 1.8). Vea la respuesta de @ SupunSameera para una versión que funciona con las versiones más recientes de Jackson.

Los términos JSON para "nombre de nodo" son "clave". Como JsonNode#iterator() no incluye claves, debe iterar de forma differently :

for (Map.Entry<String, JsonNode> elt : rootNode.fields()) { if ("foo".equals(elt.getKey())) { // bar } }

Si solo necesita ver las claves, puede simplificar un poco las cosas con JsonNode#fieldNames() :

for (String key : rootNode.fieldNames()) { if ("foo".equals(key)) { // bar } }

Y si solo desea encontrar el nodo con la clave "foo" , puede acceder a él directamente . Esto proporcionará un mejor rendimiento (búsqueda de tiempo constante) y un código más limpio / claro que utilizando un bucle:

JsonNode foo = rootNode.get("foo"); if (foo != null) { // frob that widget }


Para Jackson 2+ ( com.fasterxml.jackson ), los métodos son un poco diferentes:

Iterator<Entry<String, JsonNode>> nodes = rootNode.get("foo").fields(); while (nodes.hasNext()) { Map.Entry<String, JsonNode> entry = (Map.Entry<String, JsonNode>) nodes.next(); logger.info("key --> " + entry.getKey() + " value-->" + entry.getValue()); }


fields () y fieldNames () no me funcionaron. Y tuve que pasar bastante tiempo para encontrar una forma de iterar sobre las teclas. Hay dos maneras en que se puede hacer.

Una es convirtiéndola en un mapa (ocupa más espacio):

ObjectMapper mapper = new ObjectMapper(); Map<String, Object> result = mapper.convertValue(jsonNode, Map.class); for (String key : result.keySet()) { if(key.equals(foo)) { //code here } }

Otro, mediante el uso de un iterador de cadena:

Iterator<String> it = jsonNode.getFieldNames(); while (it.hasNext()) { String key = it.next(); if (key.equals(foo)) { //code here } }


JsonNode root = mapper.readTree(json); root.at("/some-node").fields().forEachRemaining(e -> { System.out.println(e.getKey()+"---"+ e.getValue()); });

En una línea Jackson 2+