Jackson macht etwas wirklich Bizarres und ich kann keine Erklärung dafür finden. Ich mache polymorphe Serialisierung und es funktioniert perfekt, wenn ein Objekt für sich allein ist. Wenn Sie jedoch dasselbe Objekt in eine Liste einfügen und stattdessen die Liste serialisieren, wird die Typinformation gelöscht.Warum funktioniert die polymorphe Jackson-Serialisierung nicht in Listen?
Die Tatsache, dass es Typinfo verliert, würde dazu führen, dass man Typauslöschung vermutet. Dies geschieht jedoch während der Serialisierung des Inhalts der Liste; Alles, was Jackson tun muss, ist das aktuelle Objekt, das serialisiert wird, zu inspizieren, um seinen Typ zu bestimmen.
Ich habe ein Beispiel unter Verwendung von Jackson 2.5.1 erstellt:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.List;
public class Test {
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
@JsonSubTypes({
@Type(value = Dog.class, name = "dog"),
@Type(value = Cat.class, name = "cat")})
public interface Animal {}
@JsonTypeName("dog")
public static class Dog implements Animal {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@JsonTypeName("cat")
public static class Cat implements Animal {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) throws JsonProcessingException {
List<Cat> list = new ArrayList<>();
list.add(new Cat());
System.out.println(new ObjectMapper().writeValueAsString(list));
System.out.println(new ObjectMapper().writeValueAsString(list.get(0)));
}
}
Hier ist der Ausgang:
[{"name":null}]
{"@type":"cat","name":null}
Wie Sie sehen können, Jackson ist das Hinzufügen nicht die Typinformationen, wenn das Objekt in einer Liste. Weiß jemand, warum das passiert?
Sie wie 'neue ObjectMapper können auch() writerFor (mapper.getTypeFactory() constructCollectionType (List.class, Tier.. Klasse)). writeValueAsString (Liste) ' –
Das ist wirklich seltsam, und ich kann mir nicht vorstellen, warum sie diese Wahl treffen würden. Unabhängig vom Typ der Liste würden Sie denken, dass die Objekte, die darin enthalten sind, auf die gleiche Weise serialisiert werden. – monitorjbl
mapper.writerWithType (mapper.getTypeFactory(). ConstructCollectionType (List.class, Animal.class)). WriteValueAsString (list) – Youness