使用jackson将json反序列化为复杂的Map对象

时间:2015-09-01 00:48:52

标签: json jackson

考虑以下json示例

{
    "key1" : {

        "k11":["vala","valb","valc"],
        "k12":["vald"],
        "k13":["vale","valf"]
    },
    "key2" : {

        "key21":["valg","valh","vali"],
        "key22":["valj"],
        "key23":["valk","vall"]
    }
}

这转换为Map< String,Map< String,List< String>>>。

有谁能告诉我如何将此转换为这个复杂的Map对象。我做了一个名为constructMapType的方法,但不确定它是否处理复杂的Map类型。

1 个答案:

答案 0 :(得分:2)

似乎与.constructMapType(Map.class, String.class, Map.class)

一起正常工作
public static void main(String[] args) throws Exception {
    final String json
            = "{\n"
            + "    \"key1\" : {\n"
            + "        \"k11\":[\"vala\",\"valb\",\"valc\"],\n"
            + "        \"k12\":[\"vald\"],\n"
            + "        \"k13\":[\"vale\",\"valf\"]\n"
            + "    },\n"
            + "    \"key2\" : {\n"
            + "        \"key21\":[\"valg\",\"valh\",\"vali\"],\n"
            + "        \"key22\":[\"valj\"],\n"
            + "        \"key23\":[\"valk\",\"vall\"]\n"
            + "    }\n"
            + "}";
    ObjectMapper mapper = new ObjectMapper();

    Map<String, Map<String, List<String>>> map 
            = mapper.readValue(json,TypeFactory.defaultInstance()
                    .constructMapType(Map.class, String.class, Map.class));

    for (String outerKey: map.keySet()) {
        System.out.println(outerKey + ": " + map.get(outerKey));
        for (String innerKey: map.get(outerKey).keySet()) {
            System.out.print(innerKey + ": [");
            for (String listValue: map.get(outerKey).get(innerKey)) {
                System.out.print(listValue + ",");
            }
            System.out.println("]");
        }
    }
}

您可以一直向下列出所有仿制药,直到List<String>,但如上所示,它是没有必要的。但只是为了表明我的意思

TypeFactory factory = TypeFactory.defaultInstance();
Map<String, Map<String, List<String>>> map 
        = mapper.readValue(json, factory.constructMapType(
                Map.class, 
                factory.constructType(String.class), 
                factory.constructMapType(
                        Map.class, 
                        factory.constructType(String.class), 
                        factory.constructCollectionType(
                                List.class, 
                                String.class))));