Lin*_*Out 5 java polymorphism json jackson
我需要像这样反序列化 Json:
{
"arrayObj1":[
{
"type":"t1",
"value":[
{
"value1":"a"
},
{
"value2":"b"
}
],
"otherInfo":"abc"
}
]
}
Run Code Online (Sandbox Code Playgroud)
这就是我尝试这样做的方式:
public class ClassA{
private ArrayObj1[] arrayObj1;}
Run Code Online (Sandbox Code Playgroud)
然后...
public class ArrayObj1 extends Value{
private String type;
private Value [] value;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
property = "type")
@JsonSubTypes(value={
@JsonSubTypes.Type(value = T1.class, name = "t1")
})
public void setValue (Value [] value){
this.value = value;
}
}
Run Code Online (Sandbox Code Playgroud)
和...
public abstract class Value {}
Run Code Online (Sandbox Code Playgroud)
这是错误 iv 得到: com.fasterxml.jackson.databind.JsonMappingException:意外的令牌(START_OBJECT),预期的 START_ARRAY:需要 JSON 数组来包含类的 As.WRAPPER_ARRAY 类型信息...等
这要怎么处理呢?谢谢。
编辑:这就是我反序列化的方式:
public ClassA getObj (String jsonString) {
ClassA obj = null;
try {
obj = new ObjectMapper().readValue(jsonString, ClassA.class);
} catch (IOException e) {
e.printStackTrace();
}
return obj;
}
Run Code Online (Sandbox Code Playgroud)
完整错误是:
com.fasterxml.jackson.databind.JsonMappingException:意外的标记(START_OBJECT),预期的 START_ARRAY:需要 JSON 数组来包含类 .Value 的 As.WRAPPER_ARRAY 类型信息 [来源:java.io.StringReader@4317b868;行:1,列:496](通过引用链:.ClassA["arrayObj1"]->.ArrayObj1["value"])
考虑到您使用的结构,您实际上需要多一级类来包含外部类型 id。所以像这样:
public class ClassA {
private ValueWrapper[] arrayObj1;
}
public class ValueWrapper {
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
property = "type")
@JsonSubTypes(value={
@JsonSubTypes.Type(value = T1.class, name = "t1")
}
public Value value;
public String otherInfo;
// or use getters/setters in addition; left as fields for brevity
}
public abstract class Value { ... }
Run Code Online (Sandbox Code Playgroud)
)
然而,更仔细地观察您的 JSON,实际上只有当您的值是 POJO 时,这才有效。如果假设该类型适用于数组的所有元素value,则没有自动方法可以做到这一点。不幸的是,您需要手动处理多态类型。
| 归档时间: |
|
| 查看次数: |
15074 次 |
| 最近记录: |