我正在编写一系列Java类来表示Spring服务中的请求和响应,配置为使用基于JSON 2.0的注释处理和jackson-databind模块。这些类包含各种字段,在需要时进行注释,以支持JSON对象的序列化和反序列化。
我有一个POJO,它包含一个具有多态值的Map字段。映射值可以有几种类型,主要是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对象被序列化为,而不需要显式地将类型名称添加到其中。在本例中,在反序列化时,当杰克逊发现一个未知的数组结构时,它将生成ArrayNode。当遇到其他多态类型时,它仍然会继续生成其他多态类型。
上面的示例如下所示:
outputValues: {
result:
[
{
Content-Type: "application/json",
url: "http://server.url"
},
{
Content-Type: "application/json",
url: "http://server.url.2"
}
]
}发布于 2013-10-23 22:51:10
经过进一步的研究,我得出结论,如果不推翻杰克逊的序列化程序,就不可能解决我的问题。
从杰克逊的邮件列表中,我得到了这样的答案:
您可以覆盖(反)用于
JsonNode的序列化程序,这也可以用于更改多态类型id的处理(对于预期类型id的情况有一个单独的deserialize方法,对于序列化程序也是这样)。这样就可以处理你的案子了。
我想这是确定的答案。
https://stackoverflow.com/questions/19093616
复制相似问题