2016-03-11 69 views
1

我想將JSON映射到POJO。 JSON格式爲:將Json轉換爲Java包含類型變量(某些子類)的對象

{ 
    user: "123abc", 
    messages: [ 
     {"type":"A", "args": {"a":"str", "b":0} }, 
     {"type":"B", "args": {"c":true, "d":false} }, 
     ... 
    ] 
} 

每種類型的消息都有其自己的預期參數。例如:

class TypeAMessage extends Message { 
    String a; 
    int b; 
} 

class TypeBMessage extends Message { 
    boolean c; 
    boolean d; 
} 

我會這樣JSON映射到一個簡單的POJO,如:

class Messages { 
    @JsonProperty("user") 
    String user; 
    @JsonProperty("messageList") 
    List<Message> messageList; 

    class Message { 
     @JsonProperty("type") 
     String type; 
     @JsonProperty("args") 
     Map<String, Object> args; 
    } 
} 

但這似乎並不理想,因爲args可以包含多個變量類型(字符串,整數,.. 。),現在它們都被存儲爲一般Object變量。

我已經知道基於消息type的預期結果。由於每個type預計一組不同的參數,我認爲JSON映射到這樣的一類:

class Messages { 
    @JsonProperty("user") 
    String user; 

    @JsonProperty("messageList") 
    List<? extends Message> messageList; 

    class Message {} 

    class TypeAMessage extends Message { 
     @JsonProperty("a") 
     String a; 
     @JsonProperty("b") 
     int b; 
    } 

    class TypeBMessage extends Message { 
     @JsonProperty("c") 
     boolean c; 
     @JsonProperty("d") 
     boolean d; 
    } 
} 

我使用傑克遜JSON和JSON到對象的轉換失敗,Unrecognized field "a"(和b, c,d)),因爲這些字段不在父類Message類中。

我該怎麼做呢?或者是否有辦法通過告訴JSON對象映射器尋找子映射到每個消息子對象?

+1

[Json deserial使用傑克遜化成另一個類層次結構](http://stackoverflow.com/questions/10329706/json-deserialization-into-another-class-hierarchy-using-jackson) –

+0

@mlk感謝您的鏈接。我通過鏈接內容(和鏈接的鏈接內容)挖掘並找到解決方案。解決方案只是在問題中編寫的幾行內容之上,而且看起來比鏈接中提出的要簡單。所以我認爲這個問題是公開的並且自己回答是有幫助的。如果你不反對,我會繼續。 – Aaron

回答

0

的解決方案是一些註釋添加到Message使得JSON解串器知道使用什麼子類Message

class Messages { 
    @JsonProperty("user") 
    String user; 

    @JsonProperty("messageList") 
    List<Message> messageList; 


    @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, 
      property="type") 
    @JsonSubTypes({ 
      @JsonSubTypes.Type(value=TypeAMessage.class, name="typeA"), 
      @JsonSubTypes.Type(value=TypeBMessage.class, name="typeB") 
    }) 

    static class Message {} 

    static class TypeAMessage extends Message { 
     @JsonProperty("a") 
     String a; 
     @JsonProperty("b") 
     int b; 
    } 

    static class TypeBMessage extends Message { 
     @JsonProperty("c") 
     boolean c; 
     @JsonProperty("d") 
     boolean d; 
    } 
} 

例JSON消息,指定要使用的子類:

{ 
    "user":"someUser", 
    "messageList":[ 
     {"type":"typeA", "a":"someStr", "b":123}, 
     {"type":"typeB", "c":false, "d":true} 
    ] 
} 
0

儘量使內部類的靜態

static class TypeAMessage extends Message { 
    @JsonProperty("a") 
    String a; 
    @JsonProperty("b") 
    int b; 
} 

static class TypeBMessage extends Message { 
    @JsonProperty("c") 
    boolean c; 
    @JsonProperty("d") 
    boolean d; 
} 
+0

謝謝,雖然這不能解決問題。請參閱我發佈的答案。 – Aaron

相關問題