【问题标题】:Serializing JSON objects within a Map using Jackson 2.0使用 Jackson 2.0 在 Map 中序列化 JSON 对象
【发布时间】:2013-10-06 06:44:09
【问题描述】:

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

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

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

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

例如,对于类型为 ArrayNodeJsonNode 的子类型)的值,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 对象会被序列化没有 显式添加类型名称。在此示例中,在反序列化时,Jackson 会在发现未知数组结构时生成 ArrayNode。当它遇到时,它仍然会继续产生其他多态类型。

上面的例子看起来像这样:

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

【问题讨论】:

  • 你得到答案了吗?如果是,请将其添加为答案。我也有同样的问题
  • 不幸的是,这是不可能的。我添加了到目前为止我得到的答案。

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


【解决方案1】:

进一步搜索后,我得出的结论是,如果不覆盖 Jackson 的序列化程序,就无法解决我的问题。

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

您可以覆盖 (de) 用于 JsonNode 的序列化程序,这也可用于更改对多态类型 id 的处理(对于预期类型 id 的情况,有一个单独的 deserialize 方法,与序列化程序类似)。这也许可以处理您的案件。

我想这是确定的答案。

【讨论】:

  • 序列化器是你写的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
相关资源
最近更新 更多