我使用 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);
}
//usage:
myData mdata= (myData) getData(myData.class);
一切顺利,在从 json 读取数组中,我有这个方法:
ArrayList<myData> getDatas() {
ArrayList<myData> mdatas = new ArrayList<>();
String json ="[{'name':'john','code':'123'},{'name':'nick','code':'456'}]";
Type listType = new TypeToken<ArrayList<myData>>() {
}.getType();
if (new Gson().fromJson(json, listType) != null) {
return new Gson().fromJson(json, listType);
} else {
return mdatas;
}
}
那个代码很好。但我想在 getDatas 中传递任何类并在 json 中找到该类,然后在结果中返回该类的列表。
像这样:
ArrayList<?> getDatas(Class clazz) {
ArrayList<clazz> 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<ArrayList<clazz>>() {
}.getType();
if (new Gson().fromJson(json, listType) != null) {
return new Gson().fromJson(json, listType);
} else {
return mdatas;
}
}
问题是不能在数组列表中使用匿名类。
ArrayList<clazz> mdatas = new ArrayList<>();
Type listType = new TypeToken<ArrayList<clazz>>() {
有什么方法可以在匿名类中使用arraylist?
如果您传递类型标记(为了编译时类型安全)或任何Type
实例,则很容易。
下面的源可以是String
,Reader
和JsonReader
(参见fromJson
重载)中的任何一个。
static <E> List<E> getList(final ... source, final TypeToken<? extends List<E>> listTypeToken) {
return gson.fromJson(source, listTypeToken.getType());
}
使用示例:
final List<MyData> list = getList(jsonReader, new TypeToken<List<MyData>>() {
});
顺便说一句,TypeToken
和Gson
实例是线程安全的,可以被缓存到static final
各个领域。
static <E> List<E> getList(final ... source, final Type type) {
return gson.fromJson(source, getParameterized(List.class, type).getType());
}
此案例ParameterizedType
使用较新的 Gson 版本创建实例。请注意,您可以动态创建类型(不要与创建类混淆):您指定参数化类型List
并使用给定的type
.
使用示例:
final List<MyData> list = getList(jsonReader, MyData.class);
如果你不能使用最新的 Gson 版本,你必须ParameterizedType
像这样自己创建一个实例(匿名类接口很容易理解):
static <E> List<E> getListForOlderGson(final ... source, final Type type) {
return gson.fromJson(source, new ParameterizedType() {
@Override
public Type getRawType() {
return List.class;
}
@Override
public Type[] getActualTypeArguments() {
return new Type[]{ type };
}
@Override
public Type getOwnerType() {
return null;
}
});
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句