2012-05-11 8 views
3

Jerseyを使用してRESTサービスのクライアントを作成しました。何らかの理由で、非整列化されるJSONに空の配列がある場合、Listオブジェクトには単一の要素があります。そのオブジェクトは、デフォルトのコンストラクタで構築されたかのように、すべてのメンバーがnullに設定されています。Jerseyクライアントが空でなければならないときにJerseyクライアントがリストにオブジェクトを挿入するのはなぜですか?

Order.java:JSONサービスを消費

@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; 
    } 
} 

クライアントコード:

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

をただし、リスト:

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が返されたことを示しています「写真」は、期待通りに空ではなく、単一の写真オブジェクトを含む。このオブジェクトのすべてのメンバーは、デフォルトコンストラクタで構築されたかのようにnullです。

このオブジェクトを作成する理由とその理由は何ですか?


詳細:代わりに、オブジェクトのリストで、私は列挙型のリストをデシリアライズしようとすると、同様の問題が存在します。この場合、今度は "null"を含むサイズ1のListを取得します。

答えて

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

これは私が最初に探していた解決策ではありません。私はちょうどそれを次の最良のものとして掲示しました(これはより良いことが判明しました!)。

1

があなたのOrderクラスにこの注釈を追加します。

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 

をこの注釈は、NULL値を持つオブジェクトを書き込むことを避けるためにJacksonシリアライザに述べています。

UPD。おそらくこの注釈はPhotoクラスに追加する必要があります。

関連する問題