我目前正在使用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;
}
希望它足够清楚。
答案 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