1

ジャクソンのポリモーフィックな質問があります。JSON データをポリモーフィック型にデシリアライズしたいと考えています。Jackson のドキュメントを読むと、JSON データをポリモーフィック型に逆シリアル化できます。ただし、私には特別なケースがあります。次のようなクラス構造があります。

class Supreme {
    private String type;
}
class Foo extends Supreme {
   public String label;
}
class Bar extends Supreme {
}

注: Class Bar には、継承された「type」フィールド以外のメンバー変数はありません。

その構造を次のように変換しました。

@JsonTypeInfo(use =     JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.PROPERTY,property ="type")
@JsonSubTypes({@Type(value = Foo.class, name = "Foo"),@Type(value = Bar.class, name = "Bar") })
class Supreme {
}
class Foo extends Supreme {
    public String label;
}
class Bar extends Supreme {
}

String data=
"[{
   "type": "Foo",
   "label": "abc"
},
{
   "type": "Bar"
}]"

上記のjsonデータを次のように渡すと: new ObjectMapper().readValue(data, new TypeReference<List<Supreme>>());

「END_TOKEN からクラス Bar をデシリアライズできません」のようなメッセージが表示されます。これは、JsonTypeInfo および JsonSubTypes アノテーションが「type」プロパティを解析し、配列の 2 番目のエンティティを Bar クラスにマップする必要があることがわかったためだと思います。ただし、その 2 エンティティの type プロパティの後に「何か」を見つけようとします。つまり、Jackson はそれが空の JSON オブジェクトであると考えています。

(注: 配列の 2 番目のエントリのない上記のデータは正常に機能します。つまり、少なくとも "type" 以外のプロパティがあるため、Foo オブジェクトを含むリストに逆シリアル化できます)

これを回避する方法はありますか?

4

1 に答える 1

1

誤って、Jackson 1.5 を使用していましたが、Jackson 1.9 にぶつかると、例外はなくなりました。Jackson 1.5にバグがありました

于 2013-04-22T18:57:55.433 に答える