Używanie Jackson ObjectMapper do serializacji nazwy podklasy w JSON, a nie nadklasy
W następującym kodzie Jacksona / Javy, który serializuje obiekty w JSON, otrzymuję to:
{"animal":{"x":"x"}}
Jednak to, co chcę uzyskać, to:
{"dog":{"x":"x"}}
Czy jest coś, co mogę zrobić w AnimalContainer, aby uzyskać typ obiektu („psa”, „kota”) obiektu zamiast „zwierzęcia”)?(Edytować: Wiem, że nazwa mapy pochodzi od nazw metod getter i setter.) Jedynym sposobem, w jaki mogę pomyśleć o zrobieniu tego, jest posiadanie w AnimalContainer atrybutu każdego typu zwierząt, posiadanie setterów i getterów dla wszystkich z nich i wymuszanie, że tylko jeden jest wyceniany na raz. Ale to podważa cel posiadania superklasy zwierząt i wydaje się błędne. W moim prawdziwym kodzie mam tuzin podklas, nie tylko „psa” i „kota”. Czy jest lepszy sposób, aby to zrobić (być może używając adnotacji)? Potrzebuję również rozwiązania do deserializacji.
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 {}
}