使用Gson读取带有泛型类的匿名类数组
使用Gson读取带有泛型类的匿名类数组
我使用Gson来序列化和反序列化JSON。
POJO类:
class myData{ public String id; public String name; }
使用以下代码将JSON转换为POJO类:
public static Object getData(Class clazz) { String json = "{'name':'john','id':'123'}"; Gson gson = new Gson(); return gson.fromJson(json , clazz); } //用法: myData mdata= (myData) getData(myData.class);
一切都很顺利,当从JSON中读取数组时,我有以下方法:
ArrayListgetDatas() { ArrayList mdatas = new ArrayList<>(); String json ="[{'name':'john','code':'123'},{'name':'nick','code':'456'}]"; Type listType = new TypeToken >() { }.getType(); if (new Gson().fromJson(json, listType) != null) { return new Gson().fromJson(json, listType); } else { return mdatas; } }
这段代码很好。但是我想在getDatas中传递任何类,并在JSON中找到该类,然后在结果中返回该类的列表。
像这样的东西:
ArrayList> getDatas(Class clazz) { ArrayListmdatas = new ArrayList<>(); //这一行是问题所在 String json = "[{'name':'john','code':'123'},{'name':'nick','code':'456'}]"; //还有这一行 Type listType = new TypeToken >() { }.getType(); if (new Gson().fromJson(json, listType) != null) { return new Gson().fromJson(json, listType); } else { return mdatas; } }
问题是无法在ArrayList中使用匿名类。
ArrayListmdatas = new ArrayList<>(); Type listType = new TypeToken >() {
有没有办法使用匿名类来使用ArrayList?
问题原因:问题是由于"Class"类型的实例与泛型类型不一致导致的。在给定的代码中,问题出现在创建ArrayList实例的那一行,以及获取Type对象的那一行。
解决方法:可以将泛型类型作为函数的泛型类型绑定传入,从而可以在代码中使用它,使得传入clazz参数变得不必要。
以下是修改后的代码示例:
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; public class Main { public staticArrayList getDatas(Class clazz) { ArrayList mdatas = new ArrayList<>(); //this line is the problem String json = "[{'name':'john','code':'123'},{'name':'nick','code':'456'}]"; //and this line Type listType = new TypeToken >() { }.getType(); if (new Gson().fromJson(json, listType) != null) { return new Gson().fromJson(json, listType); } else { return mdatas; } } public static void main(String[] args) { ArrayList datas = getDatas(Clazz.class); for (Clazz data : datas) { System.out.println(data.getName() + " " + data.getCode()); } } private static class Clazz { private String name; private String code; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } } }
希望以上解决方法对您有帮助!
在使用Gson读取匿名类数组时,可能会遇到问题。以下是问题出现的原因以及解决方法。
问题出现的原因是,当使用Gson读取匿名类数组时,由于泛型的类型擦除,Gson无法正确地解析数组的类型。
为了解决这个问题,可以使用类型标记(type tokens)或任何类型(Type)实例。
使用类型标记的解决方法如下:
staticList getList(final ... source, final TypeToken extends List > listTypeToken) { return gson.fromJson(source, listTypeToken.getType()); }
使用示例:
final Listlist = getList(jsonReader, new TypeToken >() {});
需要注意的是,TypeToken和Gson实例都是线程安全的,可以缓存为静态final字段。
如果不使用类型标记,可以使用以下方法:
staticList getList(final ... source, final Type type) { return gson.fromJson(source, getParameterized(List.class, type).getType()); }
这种情况下,需要使用较新版本的Gson创建ParameterizedType实例。请注意,可以动态创建类型(与创建类不同):需要指定参数化类型List以及使用给定类型进行参数化。
使用示例:
final Listlist = getList(jsonReader, MyData.class);
如果无法使用最新版本的Gson,可以自己创建ParameterizedType实例,如下所示:
staticList getListForOlderGson(final ... source, final Type type) { return gson.fromJson(source, new ParameterizedType() { public Type getRawType() { return List.class; } public Type[] getActualTypeArguments() { return new Type[]{ type }; } public Type getOwnerType() { return null; } }); }
以上就是解决使用Gson读取匿名类数组的问题的方法。