【问题标题】:RESTEasy / Jettison, return Java object as JSON without the root nodeRESTEasy / Jettison,以不带根节点的 JSON 形式返回 Java 对象
【发布时间】:2012-01-03 18:50:41
【问题描述】:

我正在使用 RESTEasy 将 Java 对象作为 JSON 对象返回(它使用 Jettison 映射约定进行 JSON 编组)。

但我不希望它返回根节点。

例如

@XmlRootElement
public class Car{
    private Integer id;
    private String name;
}

这个类的一个对象会产生 JSON:

{"Car":{"id":6,"name":"someName"}}

因为它实际上来自

<Car>
    <id>6</id>
    <name>someName</name>
</Car>

但我不想要根节点。我只想:

{"id":6,"name":"someName"}

所以我可以将它与 Backbone.js 等客户端库一起使用

有什么方法(一些注释)可以在 JSON 编组中强制执行此操作吗?

山姆,

【问题讨论】:

  • 山姆,你的问题找到答案了吗?

标签: json backbone.js resteasy jettison


【解决方案1】:

我遇到了完全相同的问题。在做了一些研究之后,我发现人们建议使用 resteasy-jackson-provider 而不是 jettison。 据称,jettison 存在一些问题,而您所遇到的就是其中之一。我切换到杰克逊,发现它解决了这个问题,可能还有一些我不知道的问题。 如果您使用的是 Maven:

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jackson-provider</artifactId>
    <version>2.1.0.GA</version>
</dependency>

如果您这样做,您可能会看到抛掷之间的一些碰撞。为避免这些情况,请确保您的类路径中没有 jettison jar。

【讨论】:

    【解决方案2】:

    您可以像这样定义 Backbone.Mode:

    var Car = Backbone.Model.extend({
        defaults: function() {
            return {Car: {id: 0, name: 'bar'}};
        }
    }
    

    【讨论】:

      【解决方案3】:

      我在答案"JAX-RS - JSON without root node in apache CXF"上找到了一个与抛弃相关的解决方案。

      Jettison 有一个名为dropRootElement 的参数,它的功能与名称相同。就我而言,以下添加 Configuration-object 完成了这项工作:

      Configuration configuration = new Configuration();
      configuration.setDropRootElement(true);
      
      new JettisonMappedXmlDriver(configuration)
          .createWriter(this.getOutputStream()));
      

      希望对你有帮助...

      【讨论】:

      • 谢谢,当您需要/想要坚持使用 JettisonMappedXmlDriver 时,这会很有帮助!
      猜你喜欢
      • 2016-02-03
      • 2013-03-02
      • 2013-01-14
      • 2018-01-11
      • 2014-04-18
      • 1970-01-01
      • 2011-12-19
      • 2016-09-13
      • 2020-09-27
      相关资源
      最近更新 更多