【问题标题】:Custom Jackson Mapping for Inner Classes内部类的自定义杰克逊映射
【发布时间】:2011-09-29 14:25:33
【问题描述】:

我正在开发一个将 Jackson 用于 JSON 视图的 Spring MVC 应用程序。 假设我有两个类,如下所示。

class A {
   String prop;
   B other;
   // getters setters
}

class B {
   Integer id;
   String name;
}

我要解决的是获取如下所示的 JSON 字符串。 对于 A 的完全初始化实例

{prop:"something", name:"otherthing"} // in here the class B 
                                      // is replaced with its propery name

插入

{prop:"something, other:{id:5,name:"otherthing"}}

注意:上面提到的两个类是 Hibernate 的实体类。 我已经使用@JsonIgnore 从 JSON 输出中消除了一些属性,是否可以 使用注解将子类替换为其属性?

【问题讨论】:

  • 一个建议:“内部类”在标题中可能会产生误导,因为这实际上与 Java 内部类无关,而是与 JSON 结构的内联有关。但不确定什么是最适合轻松找到此问题的标题。

标签: json spring-mvc mapping jackson


【解决方案1】:

除非使用自定义序列化程序,否则这尚不可能,尽管有一个功能请求 (http://jira.codehaus.org/browse/JACKSON-132) 可能会在 Jackson 1.9 中实现(因为它的投票数相对较高,这意味着少数用户真的很想看到它实现了)。

【讨论】:

  • 1.9 将有@JsonUnwrapped;在主干中实施,工作。所以如果你真的需要它,可以从主干构建;或等到正式发布。
【解决方案2】:

如果您能够使用 Jackson 以外的库进行 JSON 序列化,则可以将 GSON (http://code.google.com/p/google-gson/) 与自定义 GsonBuilder 对象一起使用,该对象可能会让你接近你想要达到的目标。

如果您查看此blog post,它将展示如何以几种不同的方式自定义 GSON 序列化程序。我将它与自定义 ExclusionStrategy 一起使用,以使用 Spring MVC 将我的模型对象(充满循环引用)正确转换为 JSON 以实现 RESTful Web 服务。 (注意,我只是用它来序列化,而不是反序列化。)

我已经在不同的 View bean 中设置了我的 GsonBuilder,您可以看到 here。如果这看起来可能对您有所帮助并且您有任何问题,请告诉我。

【讨论】:

  • Custom GsonBuilder 几乎是一个自定义序列化程序,所以不确定这是否比使用其他 JSON 库的自定义处理程序更容易?
  • 澄清一点:GsonBuilder 是一个构建 Gson 实例的对象。 Amanda 所引用的不是“自定义”GsonBuilder 的示例——它们只是使用 GsonBuilder 的示例。此外,处理循环引用与原始问题中描述的问题并没有非常密切的关系,该问题询问将对象引用序列化为仅 JSON 字符串,而不是 JSON 对象。 Gson 目前没有比 Jackson 的可能解决方案更容易做到这一点的功能。 Gson 和 Jackson 都需要自定义序列化处理。
猜你喜欢
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 2012-10-01
  • 1970-01-01
相关资源
最近更新 更多