java - 使用 JAXB 编码嵌套对象 - 展开

标签 java json jaxb nested

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

在我的应用程序中,我使用 REST 作为 API,基本上只使用 JSON 作为负载类型,并使用 Enunciate 作为 API 的文档。您可能知道,enunciate 将从类中生成一个 xsd 模式。因此,我现在的情况是,我需要使用合适的注解为 Jackson/JSON 处理配置所有 DTO,并使用 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;
  
}

这 100% 与 Jackson/JSON 一起工作。嵌入的 Address 对象将被解包,因此 JSON 如下所示:

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

这在 Jackson 身上反复出现。 另一方面,JAXB 能够解析(大部分)Jackson 注释,因此通常您不会在两个世界中使用简单对象时遇到问题。 @JsonUnwrapped 虽然遗憾地不受 JAXB 支持,但奇怪的是(从我的 POV 来看)非常简单的用例似乎根本无法用任何 JAXB 注释反射(reflect)出来。

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

有什么想法吗?

最佳答案

JAXB (JSR-222)规范没有定义等同于 Jackson 的 @JsonUnwrapped。长期以来,我们一直在 EclipseLink MOXy 中提供该功能。通过我们的 @XmlPath 扩展实现 JAXB。

  @XmlPath(".")
  private Address address;

了解更多信息

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

关于java - 使用 JAXB 编码嵌套对象 - 展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27820658/

相关文章:

javascript - 从动态表单创建嵌套的 JSON

java - 整数解码列表不正确

java - JAXB 从 XML 检索单个元素

java - 如何添加迄今为止的天数(在jlabel中设置)

java - 选项卡布局 : Lag when switching fragments

python - 除了被调用之外,为什么会这样呢? - Python

java - 用于 OGC 模式的 Jaxb

java - 使用 spring mvc 3 将一个 Controller 重定向到另一个 Controller

java - 摆脱Guice依赖

javascript - 由于误用状态,数组未动态更新