2016-09-21 45 views
0

我想从Chrome的高级REST客户端通过JSON字符串测试我的REST服务。我在这里有一个嵌套的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

从我的理解,也许有您需要考虑两两件事:

  1. 为什么的location数据类型是Map<String, ?>?因为从您的JSON字符串中,location的类型是ArrayList,对不对?如果您想将其设置为Map,请使用以下字符串:{"location" : "\"key\":\"value\""}。如果要将其设置为List,请删除围绕该值的“”
  2. 另一件事是,你似乎想要一个层次结构来描述一些地理结构。比方说,在Asia我们有IndiaChina,并在India我们有Bengaluru和在China我们有城市Chengdu。因此,Asia的值也应该是List,其中包含IndiaChina两个项目。所以你应该删除][这里,我认为这也是你只能够检索第二个条目的原因。 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

嗨,Abhiram,无论如何,我认为你最好不要使用“地图”,因为在你的例子中,位置字符串不是地图而是“列表”。如果您想使用map,请尝试“LinkedHashMap”,因为它始终是ObjectMapper代表对象的方式。 –