我需要像这样deserializa一个Json:
{
"arrayObj1":[
{
"type":"t1",
"value":[
{
"value1":"a"
},
{
"value2":"b"
}
],
"otherInfo":"abc"
}
]
}
这就是我尝试这样做的方式:
public class ClassA{
private ArrayObj1[] arrayObj1;}
则...
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;
}
}
和...
public abstract class Value {}
这是我得到的错误: 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;
}
完整错误是:
com.fasterxml.jackson.databind.JsonMappingException:意外的令牌 (START_OBJECT),预计START_ARRAY:需要包含JSON数组 类的.WRAPPER_ARRAY类型信息.Value at [来源: java.io.StringReader@4317b868; line:1,column:496](通过 参考链:.ClassA [" arrayObj1"] - > .ArrayObj1 [" value"])
答案 0 :(得分:0)
根据您使用的结构,您实际上需要一个级别的类来包含外部类型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 { ... }
)
但是,仔细查看您的JSON,这实际上只有在您的值为POJO时才有效。如果假设该类型适用于value
数组的所有元素,则没有自动化方法。
遗憾的是,您需要手动处理多态类型。