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

标签 java json web-services spring-mvc jackson

我正在编写一系列 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 中正确序列化类名,从而可以将值反序列化为适当的具体类型。

例如,对于 ArrayNode 类型的值(JsonNode 的子类型),Jackson 将显式添加类型名称 “com.fasterxml.jackson”。 databind.node.ArrayNode",在生成的 JSON 中。

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"
             }
        ]
}

最佳答案

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

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

You can override (de)serializer used for JsonNode, and that can be used to change handling of polymorphic type ids too (there is a separate deserialize method for case of expected type id, similarly for serializer). This might make it possible to handle your case.

我想这就是最终的答案。

关于java - 使用 Jackson 2.0 在 Map 中序列化 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19093616/

相关文章:

.NET ASMX - 返回纯 JSON?

java - 如何在 Mac OS X 上将 Java Swing GUI 录制为视频文件?

java : "error: unreported exception Exception; must be caught or declared to be thrown"

java - 同心圆和阵列

java - 在 main 方法中启动手动线程

java - IllegalArgumentException : com. sun.xml.internal.messaging.saaj.soap.LocalStrings != com.sun.xml.messaging.saaj.soap.LocalStrings

php - 解析由 PDO 语句创建的 JSON 对象

javascript - 引用 JSON 子数据

php - 如何在使用 JSON_FORCE_OBJECT 参数时删除 php json 编码函数中的 JSON 对象 ID

c# - 通过提供邮政编码获取城市名称的 Web 服务