我正在使用Jackson来解析我无法控制的JSON.JSON看起来像这样:
{
"status":"0"
"type":"type1"
"info": {
// additional fields
}
}
Run Code Online (Sandbox Code Playgroud)
我的班级看起来像这样
public class Response {
private String status;
private String type;
private Info info
}
Run Code Online (Sandbox Code Playgroud)
我使用的Info的子类取决于type属性,所以我对info的映射是
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
@JsonSubTypes(value = {
@JsonSubTypes.Type(value = Type1Info.class, name = "type1"),
@JsonSubTypes.Type(value = Type2Info.class, name = "type2") })
public abstract class Info {
// some fields
}
Run Code Online (Sandbox Code Playgroud)
据我所知,当区别元素与必须被转换的元素处于同一级别时,这是使用类型信息的正确方法.但这不起作用,我总是得到同样的错误:
com.fasterxml.jackson.databind.JsonMappingException:意外的标记(END_OBJECT),期望的FIELD_NAME:缺少属性'type',包含类型id
如果我将EXTERNAL_PROPERTY更改为PROPERTY,我仍会得到相同的错误.我对EXTERNAL_PROPERTY的理解是错误的吗?
JSON 嵌套类数据绑定 作为答案,当我序列化和反序列化容器时,我得到了这个异常:
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not find a Value deserializer for abstract type [simple type, class com.xiaonei.wap.ps.model.Container]
at org.codehaus.jackson.map.deser.StdDeserializerProvider._handleUnknownValueDeserializer(StdDeserializerProvider.java:321)
at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:116)
at org.codehaus.jackson.map.deser.StdDeserializer.findDeserializer(StdDeserializer.java:260)
at
Run Code Online (Sandbox Code Playgroud) children: [
{
o kind: "t3"
data: { // ExampleNodeT3 class should be used for kind == t3
+ t3var1: "val1"
+ t3var2: true
}
}
{
o kind: "t4"
data: { // ExampleNodeT4 class should be used for kind == t4
+ t4var1: false
+ t4var2: 2346
}
}
] ... etc.
@JsonTypeInfo(use=Id.NAME, property="kind")
@JsonSubTypes({
@Type(value=ExampleNodeT3.class, name="t3"),
@Type(value=ExampleNodeT4.class, name="t4")})
public abstract class ExampleNode {
...
public void setData(ExampleNode data) {
this.data = data;
}
Run Code Online (Sandbox Code Playgroud)
当尝试使用 Jackson 反序列化时,在创建 ExampleNode 数据时 …
这是一个json片段,其中包含一个数组(图标),可以包含两种不同类型的对象(应用程序和文件夹)
{
"icons": [{
"application": {
"displayName": "Facebook",
"bundleId": "com.facebook.com"
}
}, {
"folder": {
"some": "value",
"num": 3
}
}]
}
Run Code Online (Sandbox Code Playgroud)
我如何创建java POJO的这种json建模然后反序列化?
我提到了这个问题.但是我不能改变json我要在那里包含一个'type',然后使用继承来处理两个不同对象的POJO.