Dans le code suivant Jackson/Java sérialise objets en JSON, je reçois ceci:utilisant Jackson ObjectMapper sérialiser le nom de sous-classe en JSON, et non la superclasse
{"animal":{"x":"x"}}
Cependant, ce que je veux vraiment obtenir est la suivante:
{"dog":{"x":"x"}}
y at-il quelque chose que je peux faire pour AnimalContainer pour que je sois le type d'exécution (« chien », « chat ») de l'objet, au lieu de « animal »)? (Modifier: Je suis conscient que le nom de la carte provient des noms getter- et setter-method.) La seule façon dont je peux penser à le faire est dans AnimalContainer d'avoir un attribut de chaque type d'animal, poseurs et acquéreurs pour chacun d'eux, et de faire en sorte qu'un seul est évalué à la fois. Mais cela va à l'encontre du but d'avoir la superclasse animale et semble juste faux. Et dans mon vrai code, j'ai en fait une douzaine de sous-classes, pas seulement "chien" et "chat". Y a-t-il une meilleure façon de faire cela (peut-être en utilisant des annotations en quelque sorte)? J'ai aussi besoin d'une solution pour la désérialisation.
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 {}
}
est-il un moyen de résoudre avec 'ObjectMapper.enableDefaultTyping()' sans avoir besoin d'Animal étant abstrait? J'utilise Jackson 1.9 et j'ai essayé cela mais ne fonctionne toujours pas ..... –
La saisie par défaut peut utiliser différents types de critères, voir javadocs, y compris la définition personnalisée de ce à quoi il devrait s'appliquer. – StaxMan