Ich versuche, ein einfaches Beispiel der Deserialisierung JSON in polymorphe Klassen zu machen. Die Deserialisierung schlägt mit dem Fehler:Jackson Deserialize polymorphe Klassen nicht als Array
org.codehaus.jackson.map.JsonMappingException: Could not resolve type id 'aField' into a subtype of [simple type, class ...SubClassA]
Wenn ich die Deserialisierung für eine einzelne Unterklasse versuchen, nur für diese Klasse der JSON verwendet, ist es erfolgreich ist, aber wenn ich die zwei Klassen zusammen in der SubClassTestObject, es funktioniert nicht. Irgendwelche Ideen, um das zu beheben? Muss ich einen benutzerdefinierten Deserializer schreiben?
Hier meine JSON ist:
{
"classA":{
"aField":"A",
"baseField":"baseA"
},
"classB":{
"baseField":"baseB",
"bField":"B"
}
}
Hier meine Klassen sind:
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
@JsonSubTypes.Type(value = SubClassA.class, name = "classA"),
@JsonSubTypes.Type(value = SubClassB.class, name = "classB")
})
@JsonIgnoreProperties(ignoreUnknown = true)
public abstract class AbstractSimpleClass {
String baseField;
public String getBaseField() {
return baseField;
}
public void setBaseField(String baseField) {
this.baseField = baseField;
}
}
public class SubClassA extends AbstractSimpleClass {
String aField;
public String getaField() {
return aField;
}
public void setaField(String aField) {
this.aField = aField;
}
}
public class SubClassB extends AbstractSimpleClass {
String bField;
public String getbField() {
return bField;
}
public void setbField(String bField) {
this.bField = bField;
}
}
@JsonIgnoreProperties(ignoreUnknown = true)
public class SubClassTestObject {
@JsonProperty("classA")
SubClassA a;
@JsonProperty("classB")
SubClassB b;
public SubClassA getA() {
return a;
}
public void setA(SubClassA a) {
this.a = a;
}
public SubClassB getB() {
return b;
}
public void setB(SubClassB b) {
this.b = b;
}
}
Und hier ist mein Test:
@Test
public void testBoth() throws IOException, URISyntaxException {
ClassLoader classLoader = getClass().getClassLoader();
json = new String(Files.readAllBytes(Paths.get(classLoader.getResource("test/so-example.json").toURI())));
ObjectMapper mapper = new ObjectMapper();
mapper.registerSubtypes(SubClassA.class, SubClassB.class);
SubClassTestObject testObj = mapper.readValue(json, SubClassTestObject.class); //Fails here
SubClassA a = testObj.getA();
SubClassB b = testObj.getB();
assertTrue(a.getBaseField().equals("baseA"));
assertTrue(b.getBaseField().equals("baseB"));
assertTrue(a.getaField().equals("A"));
assertTrue(b.getbField().equals("B"));
}
Aktualisiere Frage ... – PunDefeated
Bitte überprüfen Sie in der Zukunft Ihre Frage, bevor Sie sie posten. Dies ist ein ganz anderes Szenario. – Savior
Meine schlechte, nachdem ich die erste Antwort gesehen habe, sah ich, was eines der Probleme war, also reparierte ich es, und es verwandelte sich in ein anderes Problem. – PunDefeated