使用Gson读取带有泛型类的匿名类数组

15 浏览
0 Comments

使用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中读取数组时,我有以下方法:

ArrayList getDatas() {
        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) {
    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;
    }
}

问题是无法在ArrayList中使用匿名类。

 ArrayList mdatas = new ArrayList<>(); 
 Type listType = new TypeToken>() {

有没有办法使用匿名类来使用ArrayList?

0
0 Comments

问题原因:问题是由于"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 static  ArrayList 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;
        }
    }
}

希望以上解决方法对您有帮助!

0
0 Comments

在使用Gson读取匿名类数组时,可能会遇到问题。以下是问题出现的原因以及解决方法。

问题出现的原因是,当使用Gson读取匿名类数组时,由于泛型的类型擦除,Gson无法正确地解析数组的类型。

为了解决这个问题,可以使用类型标记(type tokens)或任何类型(Type)实例。

使用类型标记的解决方法如下:

static  List getList(final ... source, final TypeToken> listTypeToken) {
    return gson.fromJson(source, listTypeToken.getType());
}

使用示例:

final List list = getList(jsonReader, new TypeToken>() {});

需要注意的是,TypeToken和Gson实例都是线程安全的,可以缓存为静态final字段。

如果不使用类型标记,可以使用以下方法:

static  List getList(final ... source, final Type type) {
    return gson.fromJson(source, getParameterized(List.class, type).getType());
}

这种情况下,需要使用较新版本的Gson创建ParameterizedType实例。请注意,可以动态创建类型(与创建类不同):需要指定参数化类型List以及使用给定类型进行参数化。

使用示例:

final List list = getList(jsonReader, MyData.class);

如果无法使用最新版本的Gson,可以自己创建ParameterizedType实例,如下所示:

static  List 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读取匿名类数组的问题的方法。

0