3

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

订单.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":[]}

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

是什么创建了这个对象,为什么?


更多详细信息:如果我尝试反序列化枚举列表而不是对象列表,则存在类似的问题。在这种情况下,这次我还得到一个大小为 1 的列表,其中只包含“null”。

4

2 回答 2

1

我从来没有找到一个像样的答案,只是恢复使用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);

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

于 2012-05-16T10:23:57.547 回答
1

将此注释添加到您的Order课程中:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)

这个注解告诉Jackson序列化器避免用空值写入对象。

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

于 2012-05-16T10:28:29.703 回答