8

Jackson 2を使用して、各ケースを処理するためにJsonSerializer / JsonDeserializerを繰り返し作成することなく、オブジェクトを単一の値としてシリアル化する(その後、後でその単一のフィールドのみにデータを入力する)一般的な方法を探しています。@JsonIdentityInfoアノテーションはかなり近くにありますが、私が知る限り、最初の出現時に常に完全な子オブジェクトをシリアル化するため、マークが少し欠落しています。

これが私がやりたいことの例です。クラスを考えると:

class Customer {

    Long id = 99;
    String name = "Joe"; 
    // Lots more properties
}

class Order {
    String orderNum = "11111"
    @WhateverAnnotationsINeedHereToDoWhatIWant
    Customer customer;
}

Orderをどちらかとしてシリアル化したいと思います(どちらも私には完全に受け入れられます):

{"orderNum":"11111", "customer":"99"}
{"orderNum":"11111", "customer":{"id":99}}

@JsonIdentityInfoが行うことにより、クライアント側での処理がより困難になります(クライアントは、顧客IDを完全な顧客情報にマップする方法を知っていると想定できます)。

@JsonIgnorePropertiesは、表示されている2番目のJSONにもかなり近づく可能性がありますが、必要なもの以外はすべてオプトアウトする必要があることを意味します。

デシリアライズバックするときは、顧客を「id」フィールドのみで初期化する必要があります。

ジャクソンのスープのような内部に入ることなく私が逃しているこれを行うための魔法の方法はありますか?私の知る限り、JsonDeserializer / JsonSerializerには親に関するコンテキスト情報がないため、@ JsonValueFromProperty( "id")タイプのJackson Mix-inを作成して、そのアノテーションを確認する簡単な方法はないようです。カスタムシリアライザー/デシリアライザー。

任意のアイデアをいただければ幸いです。ありがとう!

4

2 に答える 2

8

以前は、さまざまなタイプのリクエストごとに返される JSON をきめ細かく制御する必要がありましたが、最終的にカスタムのシリアライザーとデシリアライザーを使用することになりました。

簡単な代替方法は、 @JsonIgnore を Order の Customer フィールドに追加し、次の getter を Order に追加することです。

@JsonProperty("customer")
public Long getCustomerId(){
  if (customer != null){
    return customer.getId();
  }
  else {
    return null;
  }
}

返される JSON は次のようになります。

{"orderNum":"11111", "customer":"99"}
于 2012-08-23T18:02:25.987 に答える
4

もう 1 つの可能性は@JsonValue、id フィールドで使用される の使用です。

Jackson 2.1 では、強制参照を id として強制的にシリアル化する機能が追加されます (新しいプロパティ "firstAsId" for によって@JsonIdentityInfo)。すべてのケースでデシリアライゼーションがうまく機能するとは限りませんが、おそらくうまくいくでしょう。

于 2012-08-23T18:57:17.253 に答える