你會如何反序列化JSON文檔使用傑克遜POJO,如果你不知道沒有檢查消息使用什麼類型的POJO。有沒有辦法向傑克遜註冊一組POJO,以便根據消息選擇一個POJO?消息POJO使用傑克遜
我試圖解決的方案是通過線路接收JSON消息和反序列化到基於消息的內容POJO的幾個之一。
你會如何反序列化JSON文檔使用傑克遜POJO,如果你不知道沒有檢查消息使用什麼類型的POJO。有沒有辦法向傑克遜註冊一組POJO,以便根據消息選擇一個POJO?消息POJO使用傑克遜
我試圖解決的方案是通過線路接收JSON消息和反序列化到基於消息的內容POJO的幾個之一。
我不知道,你所描述的機制。 我認爲你將不得不自行檢查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領域,以解決該類型。
如果你在你的JSON庫的靈活性,看看Jackson。它有一個BeanDeserializer可以用於這個目的。
這不是真的清楚如何使用類反序列化給出的消息.. – Josh 2012-03-21 23:36:28
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);
這看起來很不錯的內容,具體的POJO。我很欣賞這種迴應。 – Josh 2012-03-22 15:45:55
一個額外的建議:也可以直接從樹('JsonNode')轉換成由POJO:「對象myObject的= mapper.treeAsValue(節點,類型);」。 這不僅更高效,而且還允許您修改樹(如果需要)(添加或刪除節點,更改值)。 – StaxMan 2012-03-22 17:18:22