2012-03-21 100 views
3

你會如何反序列化JSON文檔使用傑克遜POJO,如果你不知道沒有檢查消息使用什麼類型的POJO。有沒有辦法向傑克遜註冊一組POJO,以便根據消息選擇一個POJO?消息POJO使用傑克遜

我試圖解決的方案是通過線路接收JSON消息和反序列化到基於消息的內容POJO的幾個之一。

回答

2

我不知道,你所描述的機制。 我認爲你將不得不自行檢查JSON:

Map<String, Class<?>> myTypes = ... 
    String json = ... 
    JsonNode node = mapper.readTree(json); 
    String type = node.get("type").getTextValue(); 
    Object myobject = mapper.readValue(json, myTypes.get(type)); 

如果你沒有一個類型字段,你將不得不檢查在JsonNode領域,以解決該類型。

+0

這看起來很不錯的內容,具體的POJO。我很欣賞這種迴應。 – Josh 2012-03-22 15:45:55

+1

一個額外的建議:也可以直接從樹('JsonNode')轉換成由POJO:「對象myObject的= mapper.treeAsValue(節點,類型);」。 這不僅更高效,而且還允許您修改樹(如果需要)(添加或刪除節點,更改值)。 – StaxMan 2012-03-22 17:18:22

0

如果你在你的JSON庫的靈活性,看看Jackson。它有一個BeanDeserializer可以用於這個目的。

+0

這不是真的清楚如何使用類反序列化給出的消息.. – Josh 2012-03-21 23:36:28

0

BeanDeserializer,傑克遜已經過時了。 但是,我遇到了同樣的問題,我使用Google的GSon解決了這個問題。看看這個例子。

鑑於你的POJO數據類型:

class BagOfPrimitives { 
    private int value1 = 1; 
    private String value2 = "abc"; 
    private transient int value3 = 3; 
    BagOfPrimitives() { 
    // no-args constructor 
    } 
} 
  • 系列化

    BagOfPrimitives obj = new BagOfPrimitives(); 
    Gson gson = new Gson(); 
    String json = gson.toJson(obj); // ==> json is {"value1":1,"value2":"abc"} 
    

請注意,您不能序列循環引用的對象,因爲這將導致無窮遞歸。

  • 反序列化

    BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);