3

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

ただし、List "photos" は予想どおり空ではありませんが、1 つの Photo オブジェクトが含まれています。このオブジェクトのすべてのメンバーは、既定のコンストラクターで構築されたかのように null です。

このオブジェクトを作成しているのは何ですか?またその理由は何ですか?


詳細: オブジェクトのリストの代わりに、列挙型のリストを逆シリアル化しようとすると、同様の問題が発生します。この場合、今度は「null」だけを含むサイズ 1 のリストも取得します。

4

2 に答える 2

1

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

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)

この注釈はJackson、null 値を持つオブジェクトを書き込まないようにシリアライザーに指示します。

アップデート。おそらく、この注釈Photoもクラスに追加する必要があります。

于 2012-05-16T10:28:29.703 に答える
1

私はまともな答えを見つけることができず、JSON のすべてのマーシャリングとアンマーシャリングにGsonを使用することに戻りました。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 に答える