如果列表包含不同的类,如何使用 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对象?
我又发现了一个问题,现在列表是<ArrayList<ArrayList<Animal>>>
,我试过TypeToken<List<List<Animal>>> token = new TypeToken<List<List<Animal>>>() ;
和TypeToken<ArrayList<ArrayList<Animal>>> token = new TypeToken<ArrayList<ArrayList<Animal>>>() ;
,都抛出异常class android.widget.Editor$InsertionHandleView声明多个JSON字段命名mDownPositionY,如何从 2D json 中获取对象?
第一个问题this可以帮到你
帮助了我。谢谢。
@gschambial 我很高兴它帮助了你... :)以上是关于如果列表包含不同的类,如何使用 gson 将 json 转换为 arraylist?的主要内容,如果未能解决你的问题,请参考以下文章