オブジェクトを JSON にシリアル化する次の Jackson/Java コードでは、次のようになります。
{"animal":{"x":"x"}}
しかし、私が実際に取得したいのはこれです:
{"dog":{"x":"x"}}
「動物」の代わりにオブジェクトの実行時タイプ (「犬」、「猫」) を取得するために、AnimalContainer に対してできることはありますか? (編集: マップ名は getter- および setter- メソッド名に由来することを認識しています。)私が考えることができる唯一の方法は、AnimalContainer 内で Animal の各タイプの属性を持ち、setter と getter を持つことです。一度に 1 つだけが評価されるようにします。しかし、これは Animal スーパークラスを持つ目的に反しており、間違っているように見えます。私の実際のコードには、「犬」と「猫」だけでなく、実際には十数個のサブクラスがあります。これを行うためのより良い方法はありますか (おそらく何らかの形で注釈を使用します)? 逆シリアル化のソリューションも必要です。
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 {}
}