以下で説明する特定の方法で Jackson を構成する必要があります。
要件
- 注釈付きフィールドは、ID のみでシリアル化されます。
- フィールドが通常のオブジェクトの場合、そのフィールドをシリアル化します
id
- フィールドがオブジェクトのコレクションの場合、配列をシリアル化します。
id
- フィールドが通常のオブジェクトの場合、そのフィールドをシリアル化します
- 注釈付きフィールドは、異なる方法でシリアル化されたプロパティ名を取得します。
- フィールドが通常のオブジェクトの場合、
"_id"
プロパティ名にサフィックスを追加します - フィールドがオブジェクトのコレクションである場合は、
"_ids"
プロパティ名にサフィックスを追加します
- フィールドが通常のオブジェクトの場合、
- 注釈については、 custom
@JsonId
のようなものを考えていました。理想的には、オプションの値を使用して名前をオーバーライドするのと同じよう@JsonProperty
に - id プロパティは、ユーザーが次のいずれかを使用して定義する必要があります。
- 既存のジャクソンズ
@JsonIdentityInfo
- または、別のクラスまたはフィールドの注釈を作成することによって
- または、プロパティの検出可能性を検査する注釈を決定することによって
id
(たとえば、JPA シナリオに役立ちます)
- 既存のジャクソンズ
- オブジェクトは、ラップされたルート値でシリアル化する必要があります
- キャメルケースの命名は、アンダースコアを使用して小文字に変換する必要があります
- これらはすべてデシリアライズ可能である必要があります (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
]
}
}
ここのところ...
要件5
ObjectMapper
は、次のように構成することで達成できます。objectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
そして
@JsonRootName("example_root_name_here")
、私のPOJOで使用しています。要件6
ObjectMapper
は、次のように構成することで達成できます。objectMapper.setPropertyNamingStrategy( PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
ご覧のとおり、まだ多くの要件を満たす必要があります。なぜこのような構成が必要なのか疑問に思っている方のために説明すると、それは私がember.js (具体的には Ember Data) 用の REST Web サービスを開発しているためです。要件のいずれかを手伝っていただければ幸いです。
ありがとう!