jackson JSON: получить имя узла из json-tree

Как получить имена узлов из дерева JSON с помощью Jackson? JSON-File выглядит примерно так:

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

у меня есть

 JsonNode rootNode = mapper.readTree(fileReader); 

и нужно что-то вроде

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

Благодарю.

Этот ответ относится к версиям jacksonа до 2+ (изначально написанный для версии 1.8). См . Ответ @ SupunSameera для версии, которая работает с более новыми версиями Jackson.


Условиями JSON для «имени узла» является «ключ». Поскольку JsonNode#iterator() не содержит ключей, вам нужно итератировать по- другому :

 for (Map.Entry elt : rootNode.fields()) { if ("foo".equals(elt.getKey())) { // bar } } 

Если вам нужно только увидеть ключи, вы можете немного упростить вещи с помощью JsonNode#fieldNames() :

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

И если вы просто хотите найти узел с ключом "foo" , вы можете получить к нему доступ напрямую . Это даст лучшую производительность (постоянный поиск) и более чистый / четкий код, чем использование цикла:

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

Для Jackson 2+ ( com.fasterxml.jackson ) методы немного отличаются:

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

fields () и fieldNames () оба не работали для меня. И мне пришлось потратить довольно много времени, чтобы найти способ перебирать ключи. Есть два способа, которыми это можно сделать.

Одним из них является преобразование его в карту (занимает больше места):

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

Другой, используя iterator String:

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

Уточнение здесь:

Хотя это будет работать:

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

Это не будет:

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

Поэтому будьте осторожны, чтобы объявить Iterator как переменную и использовать это

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

В одной строке Jackson 2+

  • итерация объекта json на Ngfor в угловом 2
  • jackson не десериализует общий список, который он сериализовал
  • Использование HttpClient и HttpPost в Android с параметрами post
  • Как показать «вставить class Json» в visual studio 2012, нажав на «Специальная вставка»?
  • Получение JSONObject из JSONArray
  • Передайте пользовательский объект в ASP.NET Webmethod из jQuery, используя JSON
  • Postgres: сгладить агрегированные пары ключ / значение из поля JSONB?
  • Retrofit2 Android: ожидается BEGIN_ARRAY, но BEGIN_OBJECT в строке 1 столбец 2 путь $
  • Как исключить поля с помощью jacksonа, не используя annotations?
  • Как добавить дополнительное свойство в сериализованную строку JSON с помощью json.net?
  • Разбор json в java-объекты в spring-mvc
  • Interesting Posts
    Давайте будем гением компьютера.