2015-04-04 4 views
1

У меня есть JSON полезной нагрузки образец, который выглядит следующим образом:Как разобрать JSON с использованием Джексона (рекурсивно или итеративно)?

{"timestamp": 1427394360, "device": {"user-agent": "Mac OS 10.10.2 2.6 GHz Intel Core i7"}} 

я разобрать его и получить пар ключ/значение с помощью этого:

Iterator<Map.Entry<String,JsonNode>> fieldsIterator = rootNode.fields(); 

while (fieldsIterator.hasNext()) { 
    Map.Entry<String,JsonNode> field = fieldsIterator.next(); 
    key = field.getKey(); 
    value = field.getValue(); 
    System.out.println("Key: " + key); 
    System.out.println("Value: " + value); 
} 

Это выходы:

Key: timestamp 
Value: 1427394360 

Key: device 
Value: {"user-agent": "Mac OS 10.10.2 2.6 GHz Intel Core i7"} 

Как я могу настроить его, чтобы я мог разобрать пару ключ/значение внутри ключа устройства, чтобы стать:

Key: "user-agent" 
Value: "Mac OS 10.10.2 2.6 GHz Intel Core i7" 

А также, может быть в формате JSON, который имеет даже более вложенную JSON внутри него ... Это означает, что некоторые JSON могут не иметь вложенную JSON и некоторые из них могут иметь несколько ...

Есть ли способ рекурсивно разбирать все пары ключ/значение из полезной нагрузки JSON с помощью Джексона?

Спасибо, что нашли время, чтобы прочитать это ...

+0

«Значение», соответствующее «устройству» ключа, представляет собой карту. Вы можете обращаться с ним так же, как и с карточкой. –

+0

Есть ли способ проверить, есть ли карта, прежде чем делать это? –

+0

'instanceof', возможно? –

ответ

3

Вы можете разместить свой код в методе и сделать рекурсивный вызов, если значение контейнера (Пример: массив или объект).

Например:

public static void main(String[] args) throws IOException { 
    ObjectMapper mapper = new ObjectMapper(); 
    final JsonNode rootNode = mapper.readTree(" {\"timestamp\": 1427394360, \"device\": {\"user-agent\": \"Mac OS 10.10.2 2.6 GHz Intel Core i7\"}}"); 
    print(rootNode); 
} 

private static void print(final JsonNode node) throws IOException { 
    Iterator<Map.Entry<String, JsonNode>> fieldsIterator = node.getFields(); 

    while (fieldsIterator.hasNext()) { 
     Map.Entry<String, JsonNode> field = fieldsIterator.next(); 
     final String key = field.getKey(); 
     System.out.println("Key: " + key); 
     final JsonNode value = field.getValue(); 
     if (value.isContainerNode()) { 
      print(value); // RECURSIVE CALL 
     } else { 
      System.out.println("Value: " + value); 
     } 
    } 
} 
0

Если бы я был разработчиком этого кода, я предпочел бы пользователь существующую библиотеку JSON (например, Джексон или GSON) для достижения этой цели.

Ниже приведен один из примеров, чтобы проанализировать представление списка объектов JSON. URL: http://www.studytrails.com/java/json/java-jackson-Serialization-list.jsp

Смежные вопросы