【问题标题】:Deserialize json into complex Map object using jackson使用jackson将json反序列化为复杂的Map对象
【发布时间】:2015-09-01 00:48:51
【问题描述】:

考虑以下 json 示例

{
    "key1" : {

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

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

这转换为 Map>>。

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

【问题讨论】:

    标签: json jackson


    【解决方案1】:

    似乎与.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&lt;String&gt;,但如上所示,这不是必需的。但只是为了说明我的意思

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

    【讨论】:

    • 谢谢,似乎有效。我认为我构建的 MapType 不正确
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2023-03-13
    • 1970-01-01
    • 2017-05-13
    • 2014-02-12
    相关资源
    最近更新 更多