Jackson多態での逆シリアライズの仕組み

Jacksonでは、@JsonTypeInfoアノテーションと@JsonSubTypesアノテーションを使用することで多態的なデシリアライズを実現できます。

  1. JSONの型情報
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
public abstract class Animal {
    private String name;
    // ...
}
  1. Jsonサブタイプ
@JsonSubTypes({
    @JsonSubTypes.Type(value = Cat.class, name = "cat"),
    @JsonSubTypes.Type(value = Dog.class, name = "dog")
})
public abstract class Animal {
    // ...
}
  1. 上記の手順を完了すると、多相型のフィールドを含む JSON 文字列をデシリアライズできます。その際、Jackson はフィールドの値に基づいて適切なサブクラスのインスタンスを自動的に認識し、作成します。たとえば、
String json = "{\"type\":\"cat\",\"name\":\"Tom\"}";
ObjectMapper objectMapper = new ObjectMapper();
Animal animal = objectMapper.readValue(json, Animal.class);

上記のコードでは、JacksonはJSON文字列内の “type”:”cat” フィールドの値に基づいて、自動的にそれを Cat クラスのインスタンスに逆シリアル化します。

上記の Animal クラスの例は抽象クラスであり、Animal オブジェクトのインスタンス化する必要がある場合は、それを通常のクラスに変更するか、または @JsonTypeIdResolver 注釈を使用してカスタム型解決を指定できます。

bannerAds