Eine Liste mit polymorphen Elementen in Jackson kann nicht (de) serialisiert werden
Ich habe ein Problem bei der (De-) Serialisierung von JSON, das nicht von mir definiert wurde.
Hier ist ein Code und JSON, der das Problem erklärt:
Code:
public static class Base {
public String klass = "base";
}
public static class SubBase extends Base {
}
public static class Sub1 extends SubBase {
public Sub1() {
klass = "Sub1";
}
}
public static class Sub2 extends SubBase {
public Sub2() {
klass = "Sub2";
}
}
public static class Holder {
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_ARRAY, property="type")
@JsonSubTypes({@JsonSubTypes.Type (name = "sub1", value = Sub1.class),@JsonSubTypes.Type(name = "sub2", value = Sub2.class)})
public List<Base> items = new ArrayList<Base>();
}
Holder holder = new Holder();
holder.items.add(new Sub1());
holder.items.add(new Sub1());
mapper.writeValueAsString(holder);
produziert
{"items":[["sub1",{"klass":"Sub1"}],["sub1",{"klass":"Sub1"}]]}
Wenn ich die JsonTypeInfo-Anmerkung in ändere
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT, property="type")
produziert
{"items":[{"sub1":{"klass":"Sub1"}},{"sub1":{"klass":"Sub1"}}]}
Bisher ist alles gut :)
Der JSON-Code, den ich vom Server erhalte, hat jedoch eine etwas andere Struktur:
{"type":"sub1", "items":[{"klass":"Sub1"},{"klass":"Sub1"}]}
Wobei der Typ des Array "items" in der Eigenschaft "type" definiert ist (beachten Sie, dass alle Elemente im Array "items" derselben Klasse angehören).
Ich kann einfach nicht herausfinden, welche JsonTypeInfo-Kombination verwendet werden soll, um dies zu erreichen. Ich habe versucht, das Include auf ".EXTERNAL_PROPERTY" zu setzen, aber das funktioniert nicht.
Das Deserialisieren mit dieser Aufnahme gibt mir "Ausnahme im Thread "main" org.codehaus.jackson.JsonGenerationException: Es kann kein Feldname geschrieben werden, da ein Wert erwartet wird" Fehlermeldung.
Meine Frage ist: Welche Anmerkung muss ich verwenden, damit '{"type": "1", "items": [{"klass": "Sub1"}, {"klass": "Sub1"}]}'füllt das' items'-Array mit allen Sub1-Instanzen auf der Basis von "Art"Eigentum des Inhabers?
Wenn dies einfach nicht möglich ist, gibt es eine andere Möglichkeit, dies zu erreichen (ohne einen benutzerdefinierten Serialisierer für Holder; ein benutzerdefinierter Serialisierer nur für das Array 'items' wäre in Ordnung)?
Vielen Dank!