如何使用GSON将JSON反序列化为相应的通用Java类型?

时间:2011-11-03 18:33:39

标签: java json deserialization gson

我想将JSON对象(使用GSON,因为我已经将它用于搜索对象)反序列化为类型为Map<String, Object>的常规Map。它应该创建对应于相应JSON类型的类型的对象,即此JSON对象

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

应在Map<String, Object>中反序列化,其中包含以下类型的条目:
StringString),(StringList<String> ),(StringMap<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 Simple实现它,它通过以下代码非常容易地开箱即用:

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

为什么GSON不能那么简单?

1 个答案:

答案 0 :(得分:2)

JSON.simple反序列化的结构是一个Map,其中每个条目键都是一个String,每个条目值都是一个简单的数据类型或另一个Map。

遗憾的是,使用Gson反序列化到这样的结构并不像我想的那样简单,需要几十行代码。我在http://programmerbruce.blogspot.com/2011/06/gson-v-jackson.html发布了一个这样做的例子。 (搜索短语“Gson Code将任何JSON对象转换为Map”直接跳转到相关示例。)

该博客文章还包括使用Jackson只用一行代码完成相同任务的示例。 (我强烈建议尽可能放弃Gson而选择杰克逊。)