2016-10-17 3 views
3

JSON入力を受け取るフロントエンドライブラリ用のJava SDKを作成しようとしています。基本的に、このSDKは特定のタイプのオブジェクトをJSONに変換し、そのフロントエンドライブラリで消費されます。Jackson(Polymorphic)を使用してデシリアライズするときにフィールドが見つからない

私は、アノテーションシステムを使用してjacksonの多態的なシリアライゼーション/逆シリアル化を使用しています。

私は基本クラスAと2つの子クラスBとCを持っています。クラスAはどのクラス(BまたはC)が使用されるかを決定するための型フィールドを持っています。構文は次のようなものになります。私はジャクソンのObjectMapperreadValue機能を使用して文字列化されたJSONを読み、クラスAに変換する際に、だから今

@JsonTypeInfo({ 
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.EXISTING_PROPERTY, 
    property= "type" 
}) 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value = B.class, name = "b"), 
    @JsonSubTypes.Type(value = C.class, name = "c") 
}) 
public class A { 
    private String type; 

    public void setType(String type){ 
    this.type = type; 
    } 

    public String getType(){ 
    return this.type; 
    } 
} 

public class B extends A { 

} 

public class C extends A { 

} 

を、私はベースのいずれかのクラスAまたはクラスBの正しいインスタンスを取得します型変数の値についてしかしここに実際の問題があります。私がこの機能を使用しようとすると、getType私はいつもそれらのオブジェクトにnullを取得します。私はなぜjacksonがオブジェクトの値を設定していないのかよく分かりません。

String json = "{ type: 'b' }"; // example input json 

ObjectMapper om = new ObjectMapper(); 
A a = om.readValue(json, A.class); 
// a is actually an instance of class B 

a.getType()// this is null 

答えて

2

あなたはデシリアライズ時にタイプを削除することを避けるために@JsonTypeInfoパラメータvisible = trueに追加する必要があります。

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.EXISTING_PROPERTY, 
    property= "type", 
    visible = true 
) 

可視パブリック抽象ブール()(TypeDeserializerによって除去偽

タイプ識別子値はデシリアライザにJSONストリーム(真)の一部として渡され、又は処理されるかどうかを定義するプロパティと デフォルト偽)。プロパティは のシリアル化には影響しません。デフォルト値はfalseで、Jacksonが を処理し、 JsonDeserializerに渡されるJSONコンテンツから型識別子を削除します。

+0

ありがとうございます!どのように私はドキュメントでそれを逃したか分からない。 – Rajan

関連する問題