RESTEasy / Jettison, вернуть объект Java как JSON без корневого узла - PullRequest
4 голосов
/ 22 ноября 2011

Я использую 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?

Sam

Ответы [ 3 ]

3 голосов
/ 15 декабря 2011

Я столкнулся с точно такой же проблемой. Проведя некоторое исследование, я обнаружил, что люди предлагают использовать resteasy-jackson-provider вместо джеттисона. Утверждалось, что у меня есть несколько проблем, и то, что вы испытываете, является одним из них. Я переключился на Джексона и обнаружил, что это решило эту проблему и, возможно, несколько других, о которых я не знал. Если вы используете Maven:

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

Если вы сделаете это, вы можете увидеть некоторые столкновения между сбросом. Чтобы избежать этого, убедитесь, что на вашем пути к классу нет кувшинов.

1 голос
/ 22 января 2015

Я нашел решение, связанное с Jettison, в ответе "JAX-RS - JSON без корневого узла в apache CXF" .

У Jettison есть параметр под названием dropRootElement, который делает то, чтоимя говорит.В моем случае следующее добавление Configuration -объекта сделало эту работу:

Configuration configuration = new Configuration();
configuration.setDropRootElement(true);

new JettisonMappedXmlDriver(configuration)
    .createWriter(this.getOutputStream()));

Надеюсь, это поможет ...

1 голос
/ 08 мая 2012

Вы можете определить свой Backbone.Mode так:

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