使用Jackson 2.0在Map中序列化JSON对象

时间:2013-09-30 11:56:23

标签: java json web-services spring-mvc jackson

我正在编写一系列Java类来表示Spring MVC Web服务中的请求和响应,这些服务配置为使用基于Jackson 2.0注释的JSON处理和jackson-databind模块。这些类包含各种字段,需要注释,以启用JSON对象的序列化和反序列化。

我有一个包含Map字段的POJO,具有多态值。映射值可以采用多种类型,主要是String,其他模型类,尤其是表示为JsonNode的其他JSON对象。

  @JsonTypeInfo(use = Id.CLASS)
  private Map<String, Object> outputValues;

通过使用@JsonTypeInfo注释,Jackson可以在生成的JSON中正确序列化类名,从而可以将值反序列化为适当的具体类型。

例如,对于ArrayNode类型的值(JsonNode的子类型),Jackson会在生成的JSON中明确添加类型名称"com.fasterxml.jackson.databind.node.ArrayNode"

outputValues: {
    result: [
        "com.fasterxml.jackson.databind.node.ArrayNode",
        [
             {
                Content-Type: "application/json",
                url: "http://server.url"
             },
             {
                 Content-Type: "application/json",
                 url: "http://server.url.2"
             }
        ]
   ]
}

我希望实现的是一个特殊情况,当遇到JsonNode或其某个子类型作为地图值时,JSON对象被序列化没有< / strong>明确地将类型名称添加到。在这个例子中,在反序列化时,杰克逊在发现未知的数组结构时会产生ArrayNode。遇到它时,它仍会继续产生其他多态类型。

以上示例如下所示:

outputValues: {
    result:            
        [
             {
                Content-Type: "application/json",
                url: "http://server.url"
             },
             {
                 Content-Type: "application/json",
                 url: "http://server.url.2"
             }
        ]
}

1 个答案:

答案 0 :(得分:0)

在进一步搜索之后,我得出的结论是,如果不重写Jackson的序列化器,就无法解决我的问题。

从杰克逊邮件列表中,我回答这个问题:

  

您可以覆盖(de)用于JsonNode的序列化程序,并且可用于更改多态类型ID的处理(对于预期类型ID的情况,有一个单独的deserialize方法,类似用于序列化器)。这可能会使您的案件得以处理。

我想这是最终答案。