2012-10-02 5 views
22

ジャクソンでJSONオブジェクトをデシリアライズする必要があります。ターゲットはインターフェイスなので、どの実装を使うべきかを指定する必要があります。ジャクソン - どのようにインターフェイス参照のデシリアライズのための単一の実装を指定する?

この情報は、@ JsonTypeInfo-Annotationを使用してJSONオブジェクトに格納できます。しかし、私はいつも同じなので、ソースコードで実装を指定したいと思います。

これは可能ですか?

+0

ここでの質問は1つの実装についてですが、一般的に継承について調べることができるため、@JsonTypeInfoアノテーションを参照する必要があります。例https://stackoverflow.com/questions/28089484/deserialization-with-jsonsubtypes-for-no-value-missing-property-error/31016173#31016173 – pdem

答えて

22

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); 
+5

具体的な実装を指定したい場合は、注釈としてhttp://wiki.fasterxml.com/JacksonFAQ#Deserializing_Abstract_types –

+0

素晴らしい妥協のようなサウンドです! –

+1

@David GrantコードにSimpleAbstractTypeResolverを配置する場所はどこですか?私はスプリングブートを使用しています。 –

10

あなただけの単一のインタフェースの実装を持っている場合は動作します別のアプローチがあります。

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

この質問はしばらく前に答えたが、私はあなたにチューニングObjectMapperと@JsonTypeInfo注釈、その後もずっと簡単に必要としない別のオプションを与えたいました。

+0

これはOP質問にはるかに良い答えです。 –

+0

2つの実装があり、いくつかのタイプフィールドに基づいて逆シリアル化したい場合は – Gaurav

+0

@ Gauravこの回答はあなたに役立ちます:https://stackoverflow.com/questions/27506241/parse-to-a-subclass-by-default-ジャックソン付き/27521288#27521288 –

3

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

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

関連する問題