GSON动态类绑定

时间:2011-11-29 14:05:17

标签: android dynamic gson

我目前正在使用GSON将我的JSON解析为Objects。我使用的标准方式如下:

Result response= gson.fromJson(reader, Result.class);

结果可以是具有其他Complex对象的非常复杂的对象,最多具有5个级别的复杂对象。但我对此没有任何问题。 我的问题是:我希望能够在某些对象中具有灵活类型的属性。

例如:

class Class1 {
    String hello;
}

class Class2 {
    String world;
}

class Class3 {
    Class<?> (= class1 or class2) hello;
}

// Parsing time
Class<?> response= gson.fromJson(reader, Class3.class);
try {
    Class1 ret = (Class1)response;
} catch ... {
    Class2 ret = (Class2)response;
}

希望它足够清楚。

1 个答案:

答案 0 :(得分:5)

不幸的是,最新版本的Gson(2.0)仍然没有内置的支持,可以轻松配置以提供多态反序列化。因此,如果必须使用Gson(而不是具有此类内置支持的API,如Jackson - 使用我在http://programmerbruce.blogspot.com/2011/05/deserialize-json-with-jackson-into.html发布了多态反序列化的完整示例),则自定义反序列化处理是必要的。

对于多态类型的反序列化,必须存在JSON中的某些内容以标识要反序列化的具体类型。

一种方法是让JSON中的元素专用于此目的,其中反序列化代码根据特殊用途元素的值选择正确的类型。例如:

{"type":"Class1","hello":"Hi!"} --> deserializes to Class1 instance
{"type":"Class2","world":"Earth"} --> deserializes to Class2 instance

另一种方法是仅仅打开特定JSON元素名称的存在,但不是原始问题中演示的try-catch块,我只使用if语句。

有关此主题的更多信息,请参阅Gson issue 231,以及有关何时可能在Gson中包含内置多态反序列化工具的可能信息。

另一篇包含Gson多态反序列化示例的StackOverflow.com帖子是Polymorphism with gson