自定义反序列化器,用于解析列表中嵌套对象的外部类型ID

时间:2016-02-24 16:10:10

标签: java json jackson

给出以下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对象。

0 个答案:

没有答案