使用JAXB编组嵌套对象 - 展开

时间:2015-01-07 13:32:24

标签: java json jaxb nested

我在这里遇到了一个非常简单的问题,但是现在使用谷歌超过一个小时后,我仍然找不到一个好的解决方案而且开始花费太多钱。

在我的应用程序中,我使用REST作为API,基本上只使用JSON作为有效负载类型,并使用Enunciate作为API的文档。您可能知道,enunciate将从类生成xsd架构。因此,我需要使用合适的注释配置所有DTO的Jackson / JSON处理,并使用JAXB注释来确保生成的模式是正确的,并且可以使用XJC解析为正确的类!

虽然在大多数情况下实现并不是很难实现并且完美无缺,但我有一个简单但有些特殊的情况,它完全失败了。

假设以下课程:



@JsonRootName(value = "location")
public class Location {
    
  private String label;
  
  @JsonUnwrapped
  private Address address;
  
  // constructors, getters, setters ommited..
}


//// new file

public class Address{
  
  private String city;
  private String street;
  private String postCode;
  
}




这与Jackson / JSON 100%合作。嵌入的Address对象将被解包,以便JSON如下所示:



{
  "label":"blah",
  "street":"Exchange Road",
  "city":"Stacktown"
  "postCode":"1337"
}




这与杰克逊一起工作。 另一方面,JAXB能够解析(大部分)Jackson注释,因此通常您不会在两个世界中使用简单对象时遇到问题。 @JsonUnwrapped虽然遗憾的是JAXB不支持,奇怪的是(从我的POV)非常简单的用例似乎根本不能用任何JAXB注释反映。

所发生的是,生成的模式包含嵌入的Address对象,没有任何属性/元素。因此,XJC生成的类将包含该Address对象引用。这最终导致来自应用程序的错误JSON,该应用程序将使用模式生成对象......

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

JAXB (JSR-222)规范没有定义杰克逊@JsonUnwrapped的等价物。很长一段时间以来,我们通过@XmlPath扩展程序在EclipseLink MOXy JAXB实现中提供了该功能。

  @XmlPath(".")
  private Address address;

了解更多信息

我在博客上写了更多关于MOXy @XmlPath扩展程序的内容: