4

我正在使用 RESTEasy 将 Java 对象作为 JSON 对象返回(它使用 Jettison Mapped Convention 进行 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 marshelling 上强制执行此操作?

山姆,

4

3 回答 3

3

我面临着完全相同的问题。在做了一些研究之后,我发现人们建议使用 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。

于 2011-12-15T07:50:19.433 回答
1

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

var Car = Backbone.Model.extend({
    defaults: function() {
        return {Car: {id: 0, name: 'bar'}};
    }
}
于 2012-05-08T03:46:51.720 回答
1

我在答案“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()));

希望能帮助到你...

于 2015-01-22T09:14:40.360 回答