Jacksonで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);
インターフェースが1つだけ実装されている場合に機能する別のアプローチがあります。
public class ClassYouWantToDeserialize {
@JsonDeserialize(as = ImplementationClass.class)
private InterfaceClass property;
...
}
この質問は少し前に回答されましたが、ObjectMapperを調整する必要がなく、@ JsonTypeInfoアノテーションよりもはるかに簡単な別のオプションを提供したいと思います。
インターフェイスで@JsonDeserialize(as = ImplementationClass.class)
を使用することもでき、すべての参照は同じ方法で逆シリアル化されます。
実装クラスの1つがenumである場合、enumにも@JsonFormat(shape = JsonFormat.Shape.OBJECT)
が必要になる場合があります。