Java 用于解析列表中嵌套对象的外部类型id的自定义反序列化程序
给定以下JSON:Java 用于解析列表中嵌套对象的外部类型id的自定义反序列化程序,java,json,jackson,Java,Json,Jackson,给定以下JSON: { "parent": { "id": 0, "children": [{ "child": { "id": 1, "description": "A", "parent": 0 "events": [{ "onclick": {
{
"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映射类型
这意味着我需要一个自定义反序列化程序来创建一个子对象作为OnClick对象的源
我的问题是“child”可能是许多可能的对象之一(在本例中,它可能是“child”或“孙子”)。如何在反序列化程序中找出源对象的类型?或者,我是否可以在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);
}
}
公共类SourceDeserializer扩展StdDeserializer{
公共源反序列化程序(){
super(View.class);
}
@凌驾
公共视图反序列化(JsonParser解析器,反序列化上下文)引发IOException,JsonProcessingException{
Long sourceId=parser.getCurrentName(Long.class);
/*
*TODO如何发现sourceId是引用子项还是引用子项
*孙子女?理想情况下,有一种方法来检索实际的
*子/孙对象
*/
返回新的子项(sourceId);
}
}
我无法调用ObjectMapper.readValue()上的特定对象,因为我正在反序列化父类,其中包含子对象和孙对象