En el siguiente código de Jackson/Java que serializa objetos en JSON, me estoy haciendo esto:Usando Jackson ObjectMapper para serializar el nombre de subclase en JSON, no es la superclase
{"animal":{"x":"x"}}
Sin embargo, lo que realmente quiero llegar es la siguiente:
{"dog":{"x":"x"}}
¿hay algo que pueda hacer para AnimalContainer de modo que consiga el tipo de tiempo de ejecución ("perro", "gato") del objeto, en lugar de "animal")? (Edit: Soy consciente de que el nombre del mapa proviene de los nombres del método getter- y setter-). La única forma en que puedo pensar para hacerlo es dentro de AnimalContainer para tener un atributo de cada tipo de Animal, tener setters y getters para todos ellos, y hacer cumplir que solo uno se valora a la vez. Pero esto frustra el propósito de tener la superclase Animal y parece estar mal. Y en mi código real, en realidad tengo una docena de subclases, no solo "perro" y "gato". ¿Hay una mejor manera de hacer esto (tal vez usando anotaciones de alguna manera)? Necesito una solución para deserializar, también.
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 {}
}
¿hay alguna manera de resolver con 'ObjectMapper.enableDefaultTyping()' sin la necesidad de que Animal sea abstracto? Estoy usando Jackson 1.9 y lo he intentado pero todavía no funciona ... –
La tipificación predeterminada puede usar diferentes tipos de criterios, consulte javadocs, incluida la definición personalizada de a qué se debe aplicar. – StaxMan