Gson反序列化给定对象类的对象数组
Gson反序列化给定对象类的对象数组
在GSON中,要获取对象列表,可以这样做:
Gson gson = new Gson(); Type token = new TypeToken>(){}.getType(); return gson.fromJson(json, token);
这个方法很好用,但我想进一步,使MyType参数化,这样我就可以有一个通用的函数来使用这段代码解析对象列表:
// 通用函数 publicList fromJSonList(String json, Class type) { Gson gson = new Gson(); Type collectionType = new TypeToken >(){}.getType(); return gson.fromJson(json, collectionType); } // 调用 List
myTypes = parser.fromJSonList(jsonString, MyType.class);
遗憾的是,返回的是一个StringMap的数组,而不是我的类型。T被解释为另一个泛型类型,而不是我的类型。有什么解决办法吗?
自从gson 2.8.0版本以后,可以使用TypeToken类的getParametized方法来创建typeToken对象,然后通过getType方法获取到所需的类型。例如,可以通过以下代码获取到List
TypeToken.getParameterized(List.class, myType.class).getType();
在此之前,如果想要反序列化一个包含对象数组的json字符串,需要特别处理。根据gson的文档,可以使用TypeToken类来处理这个问题。通过TypeToken的构造函数,可以创建一个包含了泛型信息的Type对象,然后将这个Type对象传递给fromJson方法,即可正确地反序列化对象数组。
然而,在之前的版本中,创建Type对象时需要使用匿名内部类,这样的写法比较繁琐。为了简化这个过程,gson 2.8.0版本引入了getParametized方法,可以更方便地创建Type对象。该方法接受一个原始类型和一组泛型参数类型,返回一个包含了泛型信息的Type对象。
因此,如果想要反序列化一个对象数组,只需使用getParametized方法创建TypeToken对象,然后通过getType方法获取到所需的Type对象,即可正确地反序列化。
以上就是问题的出现原因以及解决方法。通过使用gson 2.8.0版本引入的getParametized方法,可以更方便地处理反序列化数组对象的问题。
问题的出现是因为在使用Gson反序列化数组对象时,由于类型擦除的原因,无法获取到泛型参数的具体类型。解决方法是通过实现ParameterizedType接口来传递具体的泛型类型。
在Java中,泛型是在编译时生效的,编译后的字节码中不会包含泛型信息。因此,Gson在反序列化时无法读取到泛型信息,导致无法正确地反序列化数组对象。
为了解决这个问题,可以通过实现ParameterizedType接口来传递具体的泛型类型。具体实现方法如下:
class ListOfSomethingimplements ParameterizedType { private Class> wrapped; public ListOfSomething(Class wrapped) { this.wrapped = wrapped; } public Type[] getActualTypeArguments() { return new Type[] {wrapped}; } public Type getRawType() { return List.class; } public Type getOwnerType() { return null; } }
然后,在`fromJsonList()`方法中使用这个实现类来反序列化数组对象:
public ListfromJsonList(String json, Class klass) { Gson gson = new Gson(); return gson.fromJson(json, new ListOfSomething (klass)); }
这样,就可以通过`getFromJsonList()`方法来反序列化数组对象了。使用这种方法可以避免使用`TypeToken`,使代码更加简洁、可读性更高。
需要注意的是,这种方法只适用于已知泛型类型的情况。如果需要在另一个泛型类中使用`List
通过实现ParameterizedType接口来传递具体的泛型类型,可以解决Gson反序列化数组对象时无法获取到泛型参数具体类型的问题。这种方法可以使代码更加简洁、可读性更高。
问题:Gson如何将一个对象数组反序列化为给定的对象类?
原因:该问题的出现是因为在使用Gson进行反序列化时,有时候我们希望将一个对象数组反序列化为给定的对象类,但是直接使用Gson.fromJson方法只能将其反序列化为Object[],无法直接得到指定类的对象数组。
解决方法:我们可以通过编写一个通用的方法来解决这个问题。首先,我们需要传入一个Class对象和一个JSON字符串。然后,我们使用Gson的fromJson方法将JSON字符串反序列化为一个指定类的数组对象。接下来,我们使用Arrays.asList方法将数组转换为List对象,并将其作为结果返回。
下面是解决方法的代码示例:
public static finalList getList(final Class clazz, final String json) { final T[] jsonToObject = new Gson().fromJson(json, clazz); return Arrays.asList(jsonToObject); }
使用示例:
getList(MyClass[].class, "[{...}]");
注意事项:虽然这个解决方法非常实用,但是需要注意,Arrays.asList返回的List对象是一个只读的数组包装器,无法对其进行添加或修改操作。如果需要对List进行修改,可以将其转换为ArrayList或使用其他可变的List实现类。