В следующем коде Джексон/Java, который сериализует объекты в JSON, я получаю это:Использование Джексона ObjectMapper сериализовать имя подкласса в JSON, не суперкласса
{"animal":{"x":"x"}}
Однако то, что я на самом деле хочу, чтобы получить это:
{"dog":{"x":"x"}}
есть ли что-то я могу сделать, чтобы AnimalContainer так, что я получаю тип выполнения («собака», «кошка») объекта, а не «животное»)? (Редактировать: Мне известно, что имя карты происходит от имени метода getter и setter.) Единственный способ, которым я могу это сделать, - это в AnimalContainer иметь атрибут каждого типа 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 {}
}
есть ли способ решить с помощью ObjectMapper.enableDefaultTyping() 'без необходимости абстрактного Animal? Я использую Jackson 1.9, и я пробовал это, но все еще не работает ..... –
По умолчанию типизация может использовать разные критерии, см. Javadocs, включая пользовательское определение того, к чему это следует применить. – StaxMan