如果列表包含不同的类,如何使用 gson 将 json 转换为 arraylist?

Posted

技术标签:

【中文标题】如果列表包含不同的类,如何使用 gson 将 json 转换为 arraylist?【英文标题】:How to use gson to convert json to arraylist if the list contain different class? 【发布时间】:2015-01-16 19:52:15 【问题描述】:

我想将一个arraylist存储到磁盘,所以我使用gson将它转换为字符串

    ArrayList<Animal> anim=new ArrayList<Animal>();
    Cat c=new Cat();
    Dog d=new Dog();
    c.parentName="I am animal C";
    c.subNameC="I am cat";
    d.parentName="I am animal D";
    d.subNameD="I am dog";
    anim.add(c);
    anim.add(d);
    Gson gson=new Gson();
    String json=gson.toJson(anim);



public class Animal 

    public String parentName;


public class Cat extends Animal
    public String subNameC;


public class Dog  extends Animal
    public String subNameD;

输出字符串:

["subNameC":"I am cat","parentName":"I am animal C","subNameD":"I am dog","parentName":"I am animal D"]

现在我想用这个字符串转换回数组列表

我知道我应该使用类似的东西:

    ArrayList<Animal> anim = gson.fromJson(json, ArrayList<Animal>.class);

但这不正确,正确的语法是什么?

【问题讨论】:

我建议把它变成一个复合类..但我不知道如何将数组作为一个类来读取.. 【参考方案1】:

Kotlin 示例:

val gson = Gson()
val typeToken = object : TypeToken<ArrayList<Animal>>() 
val list = gson.fromJson<ArrayList<Animal>>(value, typeToken.type)

更快的方式:

val gson = Gson()
val array = gson.fromJson<Array<Animal>>(value, Array<Animal>::class.java)
val arrayList = ArrayList(array.toMutableList())

【讨论】:

【参考方案2】:

您可以使用以下代码将 json 转换为相应的对象列表

TypeToken<List<Animal>> token = new TypeToken<List<Animal>>() ;
List<Animal> animals = gson.fromJson(data, token.getType());

【讨论】:

这可行,但我可以将列表项转换为原始列表中的子类(Cat)anim.get(0),而新列表不能(Cat)animals.get(0),我可以将每个项目的类型保存为json并将它们恢复为java对象? 我又发现了一个问题,现在列表是&lt;ArrayList&lt;ArrayList&lt;Animal&gt;&gt;&gt;,我试过TypeToken&lt;List&lt;List&lt;Animal&gt;&gt;&gt; token = new TypeToken&lt;List&lt;List&lt;Animal&gt;&gt;&gt;() ;TypeToken&lt;ArrayList&lt;ArrayList&lt;Animal&gt;&gt;&gt; token = new TypeToken&lt;ArrayList&lt;ArrayList&lt;Animal&gt;&gt;&gt;() ;,都抛出异常class android.widget.Editor$InsertionHandleView声明多个JSON字段命名mDownPositionY,如何从 2D json 中获取对象? 第一个问题this可以帮到你 帮助了我。谢谢。 @gschambial 我很高兴它帮助了你... :)

以上是关于如果列表包含不同的类,如何使用 gson 将 json 转换为 arraylist?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用GSON配置哪些POJO字段序列化为JSON?

当列表的各个项目使用Retrofit和Gson的格式不同时,如何解析json列表?

如何正确地将特定对象列表转换为 Gson?

将项目从不同的类添加到列表框

如何将缓存的 json 字符串与 gson 一起使用?

GSON速学必会