web-dev-qa-db-ja.com

ジャクソン-インターフェイス参照のデシリアライゼーションの単一の実装を指定する方法は?

JacksonでJSONオブジェクトをデシリアライズしたいです。ターゲットはインターフェイスであるため、使用する実装を指定する必要があります。

この情報は、@ JsonTypeInfo-Annotationを使用してJSONオブジェクトに保存できます。ただし、実装は常に同じであるため、ソースコードで実装を指定します。

これは可能ですか?

31
Max Schmidt

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);
34
David Grant

インターフェースが1つだけ実装されている場合に機能する別のアプローチがあります。

public class ClassYouWantToDeserialize {
    @JsonDeserialize(as = ImplementationClass.class)
    private InterfaceClass property;
...
}

この質問は少し前に回答されましたが、ObjectMapperを調整する必要がなく、@ JsonTypeInfoアノテーションよりもはるかに簡単な別のオプションを提供したいと思います。

22
Ilya Ovesnov

インターフェイスで@JsonDeserialize(as = ImplementationClass.class)を使用することもでき、すべての参照は同じ方法で逆シリアル化されます。

実装クラスの1つがenumである場合、enumにも@JsonFormat(shape = JsonFormat.Shape.OBJECT)が必要になる場合があります。

6
Jason Smiley