使用泛型类读取 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);
}



//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,ReaderJsonReader(参见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>>() {
});

顺便说一句,TypeTokenGson实例是线程安全的,可以被缓存到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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Gson类中的VerifyError

来自分类Dev

Gson类中的VerifyError

来自分类Dev

在泛型类中使用匿名类型

来自分类Dev

GSON 读入数组类元素

来自分类Dev

在 GSON 中序列化泛型类时出现堆栈溢出错误

来自分类Dev

为什么 Jackson,GSON... 不使用泛型而是传递类对象来反序列化对象

来自分类Dev

泛型类使用泛型参数

来自分类Dev

嵌套在泛型中的类的泛型使用

来自分类Dev

如何使用泛型返回泛型类的类类型?

来自分类Dev

从 Java 中的匿名泛型类调用重载方法

来自分类Dev

在泛型类中传递int数组

来自分类Dev

泛型类中数组属性的实例?

来自分类Dev

泛型-使用父类在泛型中指定类型

来自分类Dev

使用非泛型类注册泛型接口

来自分类Dev

解析Gson Android中的动态类列表

来自分类Dev

从泛型类返回数组

来自分类Dev

如何在C#中的泛型类中使用泛型类的对象?

来自分类Dev

GSON有几个已知的类

来自分类Dev

Gson映射纬度/经度类

来自分类Dev

GSON有几个已知的类

来自分类Dev

如何使用类型的辅助类泛型

来自分类Dev

使用类对象作为泛型类型

来自分类Dev

使用类实例作为泛型类型

来自分类Dev

使用泛型在类之间进行转换

来自分类Dev

对泛型使用工厂类

来自分类Dev

在类构造函数中使用泛型

来自分类Dev

在泛型类中使用函子

来自分类Dev

如何使用泛型创建AutoValue类?

来自分类Dev

使用泛型获取类的实例