如何使用Jackson将JSON数组反序列化为HashMap?

3

我有这样的JSON对象:

 "stream_server":{  
         "value":"11",
         "list":[  
            {  
               "id":"11",
               "desc":"EU West"
            },
            {  
               "id":"4",
               "desc":"EU Sud + GB"
            },
            {  
               "id":"9",
               "desc":"DE 1"
            },
            {  
               "id":"12",
               "desc":"DE 2"
            }
         ]
      }

我为 Jackson 库生成的代码中,"list" 被表示为对象的 ArrayList

public class StreamServer {
    @JsonProperty("value")
    private String value;
    @JsonProperty("list")
    private java.util.HashMap<String, String> serverList = new HashMap<>();
}

我可以把它反序列化成Java对象,就像上面一样吗?我正在寻找示例代码。

@GoodBadandUgly,感谢您提供的链接。也许它会对我有所帮助。但这并不完全符合我的情况。例如,“id”的值“11”是键,而“desc”的值“EU West”是我的HashMap的值。在您的示例中,“id”是键,“11”是值,“desc”是键,“EU West”是值,依此类推。希望这听起来不太复杂。 - Sartre
我在这里找到了答案:https://dev59.com/g3nZa4cB1Zd3GeqPpGDX?rq=1 - Sartre
细节问题,但是你的JSON格式不正确。要么用花括号包装它,要么删除stream_server部分。 - habsq
@habsq 抱歉,这是一个复杂对象的一部分。 - Sartre
1个回答

4
你可以将其反序列化为。
public static  class StreamServer {
    @JsonProperty("value")
    private String value;

    @JsonProperty("list")
    private List<Server> serverList;

}

public static class Server {
    @JsonProperty("id")
    private String id;

    @JsonProperty("desc")
    private String desc;
}

读取Jackson代码可能类似于以下内容:

    ObjectMapper m  = new ObjectMapper();
    StreamServer s = m.readValue(json, StreamServer.class);

我明白,但List<>是多余的。 - Sartre
1
在你的 JSON 结构中,list 是一个列表,不是映射,而且列表中的每个成员都是一个 Map (或一个 JSON 对象,这取决于你如何看待它)。 - Wand Maker
那么,我不能使用“id”的值作为HashMap的键,使用“desc”的值作为HashMap的值吗? - Sartre
1
更新了答案 - 如果您可以使用另一个类来表示服务器,而不是使用Map,那么事情会更简单。 - Wand Maker
@Sartre,对于所有可能的转换,没有自动化支持。基本上,JSON数组与Java数组和“Collection”匹配,而JSON对象与“Map”和“POJO”匹配。如果您想要非标准且结构不同的内容,则需要添加转换器。我猜测您使用的工具可能是为XML设计的,因为这些工具通常在处理JSON时存在问题,原因是XML没有对象和数组之间的区别(它只有元素来包含其他元素和文本),工具以一种不适用于JSON的方式对事物进行建模。 - StaxMan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接