给出以下JSON:
{
"parent": {
"id": 0,
"children": [{
"child": {
"id": 1,
"description": "A",
"parent": 0
"events": [{
"onclick": {
"source": 1
}
}],
}
}, {
"grandchild": {
"id": 2,
"description": "B",
"parent": 0
"events": [{
"onclick": {
"source": 2
}
}],
}
}]
}
}
我试图反序列化子节点1(子节点A)和子节点2(子节点B)中包含的“onclick”事件。 onclick中的“source”字段指的是onclick的子节点的id。
JsonIdentityInfo的javadoc表示
在POJO的情况下,必须将对象id序列化为属性;对象标识目前不支持JSON数组类型(Java数组或列表)或Java Map类型。
这意味着我需要一个自定义反序列化器来创建一个Child对象作为OnClick对象的源。
我遇到的问题是“孩子”可能是许多可能的对象之一(在这个例子中,它可能是“孩子”或“孙子”)。在我的反序列化器中,我如何找出源对象的类型是什么?或者,无论如何我可以将Child / Grandchild名称作为onclick节点中的属性包含在内吗?
EventMixIn:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
@Type(value = OnClick.class, name = "onclick")
})
public abstract class EventMixIn {
@JsonProperty("source")
@JsonDeserialize(using = SourceDeserializer.class)
public abstract View getSource();
}
SourceDeserializer:
public class SourceDeserializer extends StdDeserializer<View> {
public SourceDeserializer() {
super(View.class);
}
@Override
public View deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
Long sourceId = parser.getCurrentName(Long.class);
/*
* TODO How to discover whether sourceId refers to a Child or
* a Grandchild? Ideally have a means of retrieving the actual
* Child/Grandchild object
*/
return new Child(sourceId);
}
}
我无法在ObjectMapper.readValue()上调用特定对象,因为我反序列化了Parent类,其中包含Child和Grandchild对象。