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);
и нужно что-то вроде
- Автоматическая десериализация свойств C #
- Проводка данных JSON через jQuery для действия controllerа ASP.NET MVC 4
- Разница между JSONObject и JSONArray
- как загрузить файл и данные json в почтальоне
- Разбор JSON в Excel VBA
for (JsonNode node : rootNode){ if (node.getName().equals("foo"){ //bar } }
Благодарю.
- Как написать незакодированный Json для моего представления с помощью Razor?
- Как отправить строку JSON в запрос POST в Go
- Разбор JSON-объекта в Java
- Как написать Json-файл в C #?
- Ошибка jQuery AJAX в IE
- Как преобразовать словарь в строку JSON в C #?
- Чтение и запись файла на streamingAssetsPath
- jquery fill dropdown с данными json
Этот ответ относится к версиям 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+