Как десериализовать ответ JSON от службы REST Джерси на коллекцию объектов Java - PullRequest
10 голосов
/ 14 июня 2011

Я пишу клиент, который отправляет запрос GET в службу REST, используя Jersey Client API. Response - это набор объектов, и мне нужно его десериализовать. Вот мой код:

    ClientConfig clientConfig = new DefaultClientConfig();
    clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,
            Boolean.TRUE);
    Client client = Client.create(clientConfig);
    WebResource r = client
            .resource("http://localhost:8080/rest/gadgets");

и класс, представляющий модель "гаджета" (с аннотацией @XmlRootElement для обработки JAXB):

    @XmlRootElement
public class Gadget {

    private String url;
    private String title;
    private String name;

    public Gadget() {
}


public String getUrl() {
    return url;
}

public void setUrl(String url) {
    this.url = url;
}


public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getName() {
    return name;
}

    public void setName(String name) {
        this.name = name;
    }
}

Если ответом будет просто копия гаджета, а не коллекция, он может выглядеть как

Gadget result = r.get(Gadget.class);

Но в ответ JSON содержит список гаджетов, и мне нужно прочитать его в java collection. Что-то вроде

List<Gadget> result = r.get(List<Gadget>.class);

не компилируется. Может ли кто-нибудь помочь мне здесь? Я не хочу использовать никаких дополнительных библиотек, я считаю, что это можно сделать с помощью jersey-json.jar и JAXB, но не знаю как.

Ответы [ 3 ]

17 голосов
/ 14 июня 2011

Я думаю, вы хотите использовать анонимный подкласс GenericType :

r.get(new GenericType<List<Gadget>>() {});

List<Gadget>.class не будет работать из-за стирания типа.

0 голосов
/ 18 июня 2011

Вы пробовали

Gadget[] result = r.get(Gadget[].class);

Вышеуказанное работает для меня.

0 голосов
/ 14 июня 2011

Для сериализации и / или десериализации вы можете создать JSON-классы фасада для вашего объекта, который поможет вам сериализовать и десериализовать объекты.

И я предлагаю не использовать коллекцию в таких объектах, которыеВы передаете какой-то сервлет или сеть, это делает транспортный объект очень тяжелым, вместо этого используйте обычные массивы.Это облегчит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...