【问题标题】:Automatic add Root Element in JAXB在 JAXB 中自动添加根元素
【发布时间】:2017-02-04 19:02:29
【问题描述】:

在泽西岛,我如何自动在 JAXB pojo 中添加 root?

我有我的 JAXB pojo

class Product {
   private String name;
   ....
}

默认生成的json是

{
    "name": "Burton Custom Freestlye 151",
}

我希望是这样的

{
  "product": {
    "name": "Burton Custom Freestlye 151",
  }
}

注意:我所说的 自动 并不是为了封装另一个 pojo 而创建单独的类。

这应该是在序列化/反序列化到 JSON 中。

我还有其他 JSON 不使用根元素。

【问题讨论】:

  • 为什么选择 JAXB? JAXB 用于 XML 而不是 JSON,您使用哪种 JAXB 实现?莫西?
  • spring boot starter jersey 的默认设置
  • jersey 是一个JAX-RS 实现。你的问题真的很混乱。您想要知道如何使用您最后提供的格式让您的休息资源返回 JSON 格式的结果,对吧?如果是这样,请改进您的问题,因为目前它确实具有误导性。

标签: java rest spring-boot jaxb jersey


【解决方案1】:

使用 Spring Boot,您只需将 ObjectMapper 配置为 Spring bean,然后在 Jersey 将使用映射器的地方设置 Spring Boot。 ObjectMapper自动添加根元素的配置属性是

SerializationFeature.WRAP_ROOT_VALUE

默认行为是采用类名并将其小写。如果你想要不同的东西,你可以用@XmlRootElement("newName")@JsonRootName("newName") 注释类。要制作 Spring bean,只需在您的配置类中添加以下内容

@Bean
public ObjectMapper mapper() {
    final ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.WRAP_ROOT_NAME, true);
    return mapper;
}

注意我认为这(为 ObjectMapper 创建一个 Spring bean)仅从 1.4.0 开始可用。如果您使用的是较早版本的 Boot,则只需 do this

此外,如果您期望传入的 JSON 带有包装的值,您还需要 unwrap 它。你可以这样做

DeserializationFeature.UNWRAP_ROOT_VALUE

以与上面相同的方式配置它(传递true)。


更新

(目前不是很有用,但将来可能有用)

查看source for @JsonRootName,似乎Jackson 从2.4 开始就计划在注释中添加alwaysWrap 属性。但我猜他们一直在拖延。不知道为什么。也许将来会出现。

【讨论】:

  • 我有其他 JSON 不使用根元素,我怎样才能只对特定的 pojo 执行此操作?
  • 使用我链接到的选项(用于引导 getContext 方法中,您可以确定应该获取根包装器的类型。跟踪所有需要它的类需要做一些工作,但我认为这可能是您的最佳选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 2013-06-03
相关资源
最近更新 更多