2013-10-20 106 views
1

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

作为一个例子,JSON反序列化链接对象看起来像这样:

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

我可以反序列化此没有问题,但由于书签交易评论由具有不同的t1一个kind和不同的结构内在它下面的data对象,我想重复使用JSON的相同类结构来包装它,而不必创建具有一两行差异的多个复制类。

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

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

+0

你看起来类似于此:http://stackoverflow.com/questions/17605524/jackson-delay-deserializing-field/17625688。请看我的答案。我认为你可以重复使用它来解决你的问题。 –

+0

@MichałZiober你的答案似乎依赖于JSON顶层包含你正在寻找的类型变量,我的例子没有(它嵌套在三个层次下)的事实。 –

回答

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 { ... }