2011-11-03 108 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