2013-10-20 124 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 { ... }