ジャクソンでJSONオブジェクトを逆シリアル化したい。ターゲットはインターフェースであるため、使用する実装を指定する必要があります。
この情報は、@JsonTypeInfo-Annotationを使用してJSONオブジェクトに保存できます。しかし、実装は常に同じであるため、ソースコードで実装を指定したいと思います。
これは可能ですか?
ジャクソンでJSONオブジェクトを逆シリアル化したい。ターゲットはインターフェースであるため、使用する実装を指定する必要があります。
この情報は、@JsonTypeInfo-Annotationを使用してJSONオブジェクトに保存できます。しかし、実装は常に同じであるため、ソースコードで実装を指定したいと思います。
これは可能ですか?
SimpleAbstractTypeResolverを使用します。
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule("CustomModel", Version.unknownVersion());
SimpleAbstractTypeResolver resolver = new SimpleAbstractTypeResolver();
resolver.addMapping(Interface.class, Implementation.class);
module.setAbstractTypes(resolver);
mapper.registerModule(module);
単一のインターフェース実装しかない場合に機能する別のアプローチがあります。
public class ClassYouWantToDeserialize {
@JsonDeserialize(as = ImplementationClass.class)
private InterfaceClass property;
...
}
この質問は少し前に回答されましたが、ObjectMapperを調整する必要がなく、@JsonTypeInfoアノテーションよりもはるかに単純な別のオプションを提供したいと思います。
インターフェイスでも使用でき @JsonDeserialize(as = ImplementationClass.class)
、すべての参照は同じ方法で逆シリアル化されます。
実装クラスの1つが列挙型である場合は、@JsonFormat(shape = JsonFormat.Shape.OBJECT)
列挙型も必要になる可能性があることに注意してください。