2011-11-03 107 views
2

我想反序列化一個JSON對象(使用GSON,因爲我已經使用它來進行對象的搜索)到一個類型爲Map<String, Object>的普通映射。它應該創建的那些對應於根據JSON類型類型的對象,即該JSON對象如何使用GSON將JSON反序列化爲相應的泛型Java類型?

{ 
    "docID" : "a12345", 
    "relation" : ["1", "2", "3"], 
    "title" : { "de" : "German Title", 
       "en" : "English Title"} 
} 

應當以Map<String, Object>與以下類型的條目被反序列化:
StringString),(StringList<String> ),(String,Map<String, String>)。

我試圖用以下代碼:

class Dictionary_ extends HashMap<String, Object> { 
    // nothing to do 
}; 

private static final GsonBuilder GSON_BUILDER = new GsonBuilder(); 

public Map<String, Object> deserializeJsonString(String jsonString) { 
    Dictionary_ d = new Dictionary(); 
    return GSON_BUILDER.create().fromJson(jsonString, d.getClass()); 
} 

但隨後是所得類型創建的對象的如下:
StringObject),(StringObject),(StringObject) ,我無法將這些對象轉換爲相應的「真實」類型,因爲我得到了類轉換異常。

我無法使用POJO,因爲我收到的數據沒有按類成員的預定義結構。

那麼,我如何能夠反序列化一般Java類型中的這種通用數據呢?

更新:
我只是想用JSON簡單的實現它,並且它由下面的代碼工作開箱很容易:

 Object ret = JSONValue.parse(jsonString); 
     return (List<Map<String, Object>>) ret; 

爲什麼它不工作是容易GSON ???

回答

2

JSON.simple反序列化的結構是一個Map,其中每個條目鍵都是一個String,並且每個條目值都是簡單數據類型或另一個Map。不幸的是,使用Gson反序列化到這樣的結構並不像我想的那樣簡單,只需要幾行代碼。我在http://programmerbruce.blogspot.com/2011/06/gson-v-jackson.html上發佈了一個例子。 (搜索短語「Gson代碼將任何JSON對象變成地圖」直接跳轉到相關示例。)

該博客文章還包括使用Jackson完成相同任務的示例,僅使用一行碼。 (我強烈建議儘可能放棄傑森,只要有可能。)

+0

偉大的比較帖子 – LiorH