2016-09-21 6 views
0

Я пытаюсь проверить мою службу REST на строку JSON из расширенного клиента REST от Chrome. У меня есть вложенный JSON. Я принимаю это как строки и отображения его на мой POJO класс:Извлечение значений из вложенного JSON после де-сериализации

ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(addressString, AddressPOJO.class); 

Здесь addressString держит JSON строки, приведенной ниже

{ 
"location":"[{\"Asia\":[{\"India\":[{\"city\":\"Bengaluru\"}]}], [{\"India\":[{\"city\":\"Mumbai\"}]}]}] 
} 

Мой AddressPOJO имеет переменную:

Map<String,?> location = new HashMap(); 

Я извлекаю значения из POJO на

Map<String, ?> locations = addressPOJO.getLocation(); 
Iterator iterator1 = locations.entrySet().iterator(); 
while(iterator.hasNext()){ 
    Map.Entry pair1 = (Map.Entry)iterator1.next(); 
    Map<String,?> cities = (Map<String,?>) pair1.getValue(); 
    Iterator iterator2 = dataSets.entrySet().iterator(); 
    while(iterator.hasNext()){ 
     Map.Entry pair2 = (Map.Entry)iterator2.next(); 
     Map<String,?> city = (Map<String, ?>) pair2.getValue(); 
    } 
} 

Здесь я только способен retieve второй записи, которая

[{\"India\":[{\"city\":\"Mumbai\"}]}] 

Мне нужно получить все записи. Я также пытался использовать MultiMap следующим образом:

MultiMap cities = (MultiMap) pair1.getValue(); 

Но это не принимается компилятором. Обратите внимание, что все записи имеют динамический характер, а пары (ключ, значение) изменяются в соответствии с вводом пользователя. Любые предложения, как я могу получить все записи в этом примере.

ответ

0

В моем понимании, может быть, есть 2 вещи, которые вы должны смотреть в:

  1. Почему тип данных location является Map<String, ?>? Потому что из вашей строки JSON тип location является Array или List, не так ли? Если вы хотите сделать это Map, используйте следующие строки: {"location" : "\"key\":\"value\""}. Если вы хотите сделать это List, удалите «» вокруг значения.
  2. Другое дело, что вы хотите, чтобы иерархия описывала некоторую структуру географии. Скажем, в Asia у нас есть India и China, а в India у нас есть Bengaluru, а в China у нас есть город Chengdu. Таким образом, значение Asia также должно быть List которое содержит два изделия: India и China. Поэтому вы должны удалить ] и [ здесь, и я думаю, что это также причина, по которой вы можете только сохранить вторую запись. enter image description here

Ниже мой код тестирования, я изменил свой формат JSON строку и тип данных location.

Location.java

public class Location { 
    private List location; 

    public List getLocation() { 
     return location; 
    } 

    public void setLocation(final List location) { 
     this.location = location; 
    } 
} 

TestJSON.Java

public class testJson { 
    private static ObjectMapper mapper = new ObjectMapper(); 

    public static void main(final String[] args) throws JsonParseException, JsonMappingException, IOException { 
     final String locationString = "{\"location\":[{\"Asia\":[{\"India\":[{\"city\":\"Bengaluru\"}]}, {\"India\":[{\"city\":\"Mumbai\"}]}]}]}"; 
     final Location location = mapper.readValue(locationString, Location.class); 

     System.out.println("finish"); 
    } 
} 

Тогда все записи и уровни в порядке. Может быть, вы можете попробовать.

Надеюсь, это поможет.

+0

Спасибо за ваш ответ. Извините, я, должно быть, упомянул, что удаляю все «[» символы из JSON, прежде чем сопоставлять их с POJO. Мой сторонний парень может использовать массивы для генерации JSON и, следовательно, «[». Кроме того, приведенный здесь пример - это не то, с чем я имею дело. Я просто дал несколько примеров. Итак, как уже упоминалось, я получаю ключ «Индия» не один раз. Это не будет уникальным. Теперь я делаю это уникальным, привязывая его к «_» и некоторому случайному числу. Дайте мне знать, могу ли я с этим справиться, не используя случайное число. Еще раз спасибо. –

+0

Привет, Абхирам, во всяком случае, я думаю, вам лучше не использовать «Карту», ​​потому что в вашем примере строка местоположения не является картой, а «списком». Если вы хотите использовать карту, попробуйте «LinkedHashMap», потому что всегда ObjectMapper представляет объект. –