Java 用于解析列表中嵌套对象的外部类型id的自定义反序列化程序

Java 用于解析列表中嵌套对象的外部类型id的自定义反序列化程序,java,json,jackson,Java,Json,Jackson,给定以下JSON: { "parent": { "id": 0, "children": [{ "child": { "id": 1, "description": "A", "parent": 0 "events": [{ "onclick": {

给定以下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映射类型

这意味着我需要一个自定义反序列化程序来创建一个子对象作为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()上的特定对象,因为我正在反序列化父类,其中包含子对象和孙对象