在反序列化JSON时确定类型

时间:2013-10-20 16:53:44

标签: java json jackson

我正在努力将reddit API中的一些内容反序列化为POJO。我的目标是尽可能简化代码,因为reddit中实体之间的JSON结构通常是相同的。

作为示例,反序列化链接对象的JSON将如下所示:

[
    {
        "kind": "Listing",
        "data": {
            "modhash": "",
            "children": [
                {
                    "kind": "t3",
                    "data": {
                        "title": "A sample link from reddit"
                    }
                }
            ]
        }
    }
]

我可以反序列化这个没问题,但由于reddit注释因kind t1data对象下面的RedditEntity对象而有所不同,所以我想为包装它的JSON重用相同的类结构,而不是必须创建具有一个或两个行差异的多个复制类。

我创建了一个空白界面RedditLink,并创建了一个实现它的@JsonSubType类。我的问题是我不知道如何告诉Jackson要反序列化的接口实现。通常我会使用data注释,但这只适用于对象内的成员,而不适用于包装它的成员。我也不知道如何编写一个可以在类似级别工作的自定义反序列化器,我可以从父对象中确定类型。

我的问题是,如何根据上面的kind类型对{{1}}对象进行反序列化?

1 个答案:

答案 0 :(得分:0)

为什么你需要知道上面的类型?似乎这应该工作:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "kind")
@JsonSubTypes({
        @JsonSubTypes.Type(RedditListing.class),
        @JsonSubTypes.Type(RedditLink.class),
        @JsonSubTypes.Type(RedditComment.class)})
public static interface RedditEntity {}

@JsonTypeName("Listing")
public static class RedditListing implements RedditEntity { ... }

@JsonTypeName("t1")
public static class RedditComment implements RedditEntity { ... }

@JsonTypeName("t3")
public static class RedditLink implements RedditEntity { ... }