首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Jackson 2.0在Map中序列化JSON对象

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

Stack Overflow用户
提问于 2013-09-30 11:56:22
回答 1查看 1.4K关注 0票数 1

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

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

代码语言:javascript
复制
  @JsonTypeInfo(use = Id.CLASS)
  private Map<String, Object> outputValues;

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

例如,对于ArrayNode类型的值(JsonNode的一个子类型),Jackson将显式地在结果JSON中添加类型名称"com.fasterxml.jackson.databind.node.ArrayNode"

代码语言:javascript
复制
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。当遇到其他多态类型时,它仍然会继续生成其他多态类型。

上面的示例如下所示:

代码语言:javascript
复制
outputValues: {
    result:            
        [
             {
                Content-Type: "application/json",
                url: "http://server.url"
             },
             {
                 Content-Type: "application/json",
                 url: "http://server.url.2"
             }
        ]
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-23 22:51:10

经过进一步的研究,我得出结论,如果不推翻杰克逊的序列化程序,就不可能解决我的问题。

从杰克逊的邮件列表中,我得到了这样的答案:

您可以覆盖(反)用于JsonNode的序列化程序,这也可以用于更改多态类型id的处理(对于预期类型id的情况有一个单独的deserialize方法,对于序列化程序也是这样)。这样就可以处理你的案子了。

我想这是确定的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19093616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档