如何将Jersey REST服务的JSON响应反序列化为java对象的集合

时间:2011-06-14 06:33:52

标签: java json jersey

我编写了使用Jersey Client API向REST服务发出GET请求的客户端。 响应是对象的集合,我需要反序列化它。这是我的代码:

    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");

和代表“gadget”模型的类(使用@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副本而不是集合,则可能看起来像

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

但是响应中的JSON包含一个小工具列表,我需要将其读取到java集合中。像

这样的东西
List<Gadget> result = r.get(List<Gadget>.class);

无法编译。有人可以帮我吗? 我不想使用任何额外的库,我相信这可以使用jersey-json.jar和JAXB完成,但不知道如何。

3 个答案:

答案 0 :(得分:16)

我想你想使用GenericType的匿名子类:

r.get(new GenericType<List<Gadget>>() {});
由于类型擦除,

List<Gadget>.class将无效。

答案 1 :(得分:0)

对于序列化和/或反序列化,您可以为yout对象创建JSON外观类,这将帮助您对序列进行序列化和反序列化。

我建议不要在通过某些servlet或网络的对象中使用集合,它会使运输对象非常繁重,而是使用普通数组。这将缓解你的问题。

答案 2 :(得分:0)

你试过吗

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

以上对我有用。