为什么Jersey客户端应该为空时将对象插入到我的列表中?

时间:2012-05-11 16:23:55

标签: java json rest jaxb jersey

我使用Jersey为REST服务编写了一个客户端。出于某种原因,当要解组的JSON具有空数组时,List对象中只有一个元素。该对象将所有成员设置为null,就像它刚刚使用默认构造函数构造一样。

Order.java:

@XmlRootElement
public class Order {

    private int id;
    private List<Photo> photos;
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public List<Photo> getPhotos() {
        return photos;
    }
}

使用JSON服务的客户端代码:

Client client = Client.create();
WebResource webResource = client.resource(environment.url);

Order order = webResource.path("Orders")
        .type(MediaType.APPLICATION_FORM_URLENCODED_TYPE)
        .accept(MediaType.APPLICATION_JSON_TYPE)
        .post(Order.class, formData);

日志显示返回的JSON是:

{"id":704,"photos":[]}

但是,列表“照片”不是预期的空,而是包含一个Photo对象。该对象的所有成员都为null,就好像它是使用默认构造函数构造的一样。

创建此对象的原因是什么?


更多细节:如果不是对象列表,我会尝试反序列化枚举列表,就会出现类似的问题。在这种情况下,我这次只得到一个包含“null”的大小为1的List。

2 个答案:

答案 0 :(得分:1)

将此注释添加到Order班级:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)

此注释向Jackson序列化程序说明,​​以避免使用空值编写对象。

UPD。也许这个注释也应该添加到Photo类中。

答案 1 :(得分:0)

我从来没有找到一个不错的答案,只是回复使用Gson进行JSON的所有编组和解组。它现在实际上更清洁,因为GSON对我的POJO施加更少的约束(不需要注释或可变性)。

ClientResponse response = webResource.path("Orders")
        .type(MediaType.APPLICATION_FORM_URLENCODED_TYPE)
        .accept(MediaType.APPLICATION_JSON_TYPE)
        .post(ClientResponse.class, formData);

Order order = new Gson().fromJson(response.getEntity(String.class), Order.class);

这不是我最初寻找的解决方案。我刚刚发布它作为下一个最好的东西(结果证明更好!)。