用ジャクソンObjectMapperにserializeのサブクラスの名前をJSONには、スーパークラス
-
19-09-2019 - |
質問
以下のジャクソン/Javaコードを列化オブジェクトをJSONにしています:
{"animal":{"x":"x"}}
しかし、私が実際に取得したいです:
{"dog":{"x":"x"}}
ものがあるのか、それは何なのかできないAnimalContainerその実行時の型("dog"は"ねこのオブジェクトではなく、"動物")? (編集: それを地図から名getterとsetter-方法。) みんなでAnimalContainerして属性の各種の動物に、getterとsetterか全員について記入してください、実施するだけで価値で評価されます。この敗戦を目的に動物のスーパークラスだけるよう間違っています。私の実コードを使って十数をサブクラスだけでなく、"犬"です。あると良いこと(らしいアノテーションを用なんだか)?い解deserializingました。
public class Test
{
public static void main(String[] args) throws Exception
{
AnimalContainer animalContainer = new AnimalContainer();
animalContainer.setAnimal(new Dog());
StringWriter sw = new StringWriter(); // serialize
ObjectMapper mapper = new ObjectMapper();
MappingJsonFactory jsonFactory = new MappingJsonFactory();
JsonGenerator jsonGenerator = jsonFactory.createJsonGenerator(sw);
mapper.writeValue(jsonGenerator, animalContainer);
sw.close();
System.out.println(sw.getBuffer().toString());
}
public static class AnimalContainer
{
private Animal animal;
public Animal getAnimal() {return animal;}
public void setAnimal(Animal animal) {this.animal = animal;}
}
public abstract static class Animal
{
String x = "x";
public String getX() {return x;}
}
public static class Dog extends Animal {}
public static class Cat extends Animal {}
}
解決
として このannounement, ジャクソン1.5全の多様なタイプの取り扱い、および幹現するコード統合されます。
あるというものですこの作品:
- 追加@JsonTypeInfoアノテーションを行うスーパータイプ(動物)、
- 設定オブジェクトmapperを呼び出しObjectMapper.enableDefaultTyping()がその場合、動物のニーズ抽象タイプ)
他のヒント
これはどのように変動するという回答をお探しのものが計画されており、その適切な"多型の直列化復元"(必要なサポートを直列化では、ジャクソンバージョン1.4で(なので次は1.3がします。
のための現在のバージョンは、実装のカスタムserializers/deserializers:"というだけ定義ファクトリメソッドを直列化復元のための、ゲッター用のシリアライザ(定getAnimalType'など、抽象基底クラスとして抽象的オーバーライドにサブク--も実施基底クラスの場合、出力クラス名のインスタンスのクラス?).
とにかくだけでなく、すことができないという問題の根底に潜むものwrtの実施に取り扱いのサブクラスはJSONとなくスキーマ言語(jsonまだまだ広く使用されない)
- どのようにデータを分離する(beanプロパティ値)からメタデータ(タイプ情報のみを構築するために必要な適切なサブクラス)--は別のものとしてJSON形式ではなく、定義が使命名規約に従)
- 追加方法の適正ためのアノテーションの創出と利用のメタデータ;なにより言語の特徴(なしているタイへのjavaクラス名など)
これらの命と絆を巡る物語が幕を開ける問題がないtriviallyする問題もあります。:-)
これは、私はそれを行うに考えることができる唯一の方法であり、それは醜いです。より良い方法はありますか?
@JsonWriteNullProperties(false)
public static class AnimalContainer
{
private Animal animal;
public Animal getCat()
{
return animal instanceof Cat ? animal : null;
}
public void setCat(Cat cat)
{
this.animal = cat;
}
public Animal getDog()
{
return animal instanceof Dog ? animal : null;
}
public void setDog(Dog dog)
{
this.animal = dog;
}
public Animal getFish()
{
return animal instanceof Fish ? animal : null;
}
public void setFish(Fish fish)
{
this.animal = fish;
}
}