反序列化后从嵌套JSON中检索值

时间:2016-09-21 07:45:59

标签: java web-services rest collections json-deserialization

我正在尝试通过Chrome的高级REST客户端中的JSON字符串测试我的REST服务。我这里有一个嵌套的JSON。我把它作为字符串并将其映射到我的POJO类:

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

此处, addressString 包含下面给出的JSON字符串

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

我的地址POJO有变量:

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();
    }
}

在这里,我只能检索第二个

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

我需要检索所有条目。我也试过像这样使用MultiMap

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

但编译器不接受这一点。请注意,所有条目都是动态的,并且(键,值)对根据用户的输入而变化。有关如何检索此示例中的所有条目的任何建议。

1 个答案:

答案 0 :(得分:0)

根据我的理解,也许你需要研究两件事:

  1. 为什么location的数据类型为Map<String, ?>?因为根据您的JSON字符串,location的类型是ArrayList,对吗?如果您想将其设为Map,请使用以下字符串:{"location" : "\"key\":\"value\""}。如果您想将其设为List,请删除值周围的&#34;&#34;

  2. 另一件事是,您似乎想要一个层次结构来描述某些地理结构。让我们说,在Asia我们有IndiaChina,而India我们有BengaluruChina我们有Chengdu城市Asia。因此List的值也应该是India,其中包含两个项Chinalocation。所以你应该删除] [这里,我认为这也是你只能检索第二个条目的原因。

    enter image description here

  3. 以下是我的测试代码,我修改了您的JSON字符串和public class Location { private List location; public List getLocation() { return location; } public void setLocation(final List location) { this.location = location; } } 的数据类型。

    <强> Location.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");
        }
    }
    

    <强> TestJSON.java

    {{1}}

    然后所有条目和级别都可以。也许你可以尝试一下。

    希望这会有所帮助。