jsonを多態性クラスに逆直列化する単純な例を実行しようとしています。私はちょうどそのクラスのJSONを使用して、単一のサブクラスのための直列化復元を試みる場合ジャンクション配列としてではなくポリモーフィッククラスを逆シリアル化する
org.codehaus.jackson.map.JsonMappingException: Could not resolve type id 'aField' into a subtype of [simple type, class ...SubClassA]
、それは成功しますが、私はSubClassTestObject内で一緒に2つのクラスを置くとき、それは失敗します。直列化復元は、エラーで失敗します。これを修正するための任意のアイデア?カスタムデシリアライザを記述する必要がありますか?ここで
は私のJSONです:ここでは
{
"classA":{
"aField":"A",
"baseField":"baseA"
},
"classB":{
"baseField":"baseB",
"bField":"B"
}
}
は私のクラスです:
@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;
}
}
そしてここでは、私のテストで:
@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"));
}
質問の更新... – PunDefeated
今後、投稿する前に質問を確認してください。これは非常に異なるシナリオです。 – Savior
私の悪い、最初の答えを見た後、私は問題の1つを見ていたので、私はそれを修正し、別の問題に変わった。 – PunDefeated