1

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

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

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

我可以反序列化这个没问题,但是由于 reddit 评论的不同之处在于它下面的对象中有一个kindoft1和一个不同的结构data,我想为包装它的 JSON 重用相同的类结构,而不是创建多个复制的类有一个或两个线的差异。

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

那么我的问题是,我如何data根据kind上面的类型反序列化对象?

4

1 回答 1

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 { ... }
于 2013-11-12T21:00:37.843 回答