10

以下で説明する特定の方法で Jackson を構成する必要があります。

要件

  1. 注釈付きフィールドは、ID のみでシリアル化されます。
    • フィールドが通常のオブジェクトの場合、そのフィールドをシリアル化しますid
    • フィールドがオブジェクトのコレクションの場合、配列をシリアル化します。id
  2. 注釈付きフィールドは、異なる方法でシリアル化されたプロパティ名を取得します。
    • フィールドが通常のオブジェクトの場合、"_id"プロパティ名にサフィックスを追加します
    • フィールドがオブジェクトのコレクションである場合は、"_ids"プロパティ名にサフィックスを追加します
  3. 注釈については、 custom@JsonIdのようなものを考えていました。理想的には、オプションの値を使用して名前をオーバーライドするのと同じよう@JsonProperty
  4. id プロパティは、ユーザーが次のいずれかを使用して定義する必要があります。
    • 既存のジャクソンズ@JsonIdentityInfo
    • または、別のクラスまたはフィールドの注釈を作成することによって
    • または、プロパティの検出可能性を検査する注釈を決定することによってid(たとえば、JPA シナリオに役立ちます)
  5. オブジェクトは、ラップされたルート値でシリアル化する必要があります
  6. キャメルケースの命名は、アンダースコアを使用して小文字に変換する必要があります
  7. これらはすべてデシリアライズ可能である必要があります (ID が設定されたインスタンスを構築することにより)

これらの POJO を考慮すると、次のようになります。

//Inform Jackson which property is the id
@JsonIdentityInfo(
    generator = ObjectIdGenerators.PropertyGenerator.class,
    property = "id"
)
public abstract class BaseResource{
    protected Long id;

    //getters and setters
}

public class Resource extends BaseResource{
    private String name;
    @JsonId
    private SubResource subResource;
    @JsonId
    private List<SubResource> subResources;

    //getters and setters
}

public class SubResource extends BaseResource{
    private String value;

    //getters and setters
}

Resourceインスタンスの可能なシリアル化は次のとおりです。

{
    "resource":{
        "id": 1,
        "name": "bla",
        "sub_resource_id": 2,
        "sub_resource_ids": [
            1,
            2,
            3
        ]
    }
}

ここのところ...

  • 要件5ObjectMapperは、次のように構成することで達成できます。

    objectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
    objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
    

    そして@JsonRootName("example_root_name_here")、私のPOJOで使用しています。

  • 要件6ObjectMapperは、次のように構成することで達成できます。

    objectMapper.setPropertyNamingStrategy(
        PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
    

ご覧のとおり、まだ多くの要件を満たす必要があります。なぜこのような構成が必要なのか疑問に思っている方のために説明すると、それは私がember.js (具体的には Ember Data) 用の REST Web サービスを開発しているためです。要件のいずれかを手伝っていただければ幸いです。

ありがとう!

4

1 に答える 1