我正在编写一系列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"
}
]
}
答案 0 :(得分:0)
在进一步搜索之后,我得出的结论是,如果不重写Jackson的序列化器,就无法解决我的问题。
从杰克逊邮件列表中,我回答这个问题:
您可以覆盖(de)用于
JsonNode
的序列化程序,并且可用于更改多态类型ID的处理(对于预期类型ID的情况,有一个单独的deserialize
方法,类似用于序列化器)。这可能会使您的案件得以处理。
我想这是最终答案。