从 JSONArray 转换为 ArrayList<CustomObject> - Android

Posted

技术标签:

【中文标题】从 JSONArray 转换为 ArrayList<CustomObject> - Android【英文标题】:Convert from JSONArray to ArrayList<CustomObject> - Android 【发布时间】:2014-03-24 14:59:28 【问题描述】:

我将 ArrayList 转换为 JSONArray。我怎样才能把它转换回来?

最终结果必须是一个 ArrayList。提前谢谢你。

编辑:

这就是我将 ArrayList 转换为 JSONArray 的方式:

String string_object= new Gson().toJson(MyArrayList<OBJECT>);
JSONArray myjsonarray = new JSONArray(string_object);

【问题讨论】:

什么的数组列表?您是如何将其转换为 JSONArray 的? 我创建了自己的对象,并用 3 个对象填充了一个数组列表。我首先将我的arraylist 转换为 JSONArray,然后我想将它转换回 ArrayList。有什么建议吗? 在不了解转换过程的情况下,唯一的提示是:反向运行转换过程。 我编辑了这篇文章,展示了如何从 ArrayList 转换为 JSONArray。它有效。但是我怎样才能把它转换回来呢? @DavidStanete 请参考下面我的回答,了解使用 Google 的 Gson 库将 JsonArray 转换为 ArrayList 的最简单方法。 【参考方案1】:

您可以使用下面的 Gson 库将您的 JsonArray 或 json 字符串转换为 ArrayList&lt;OBJECT&gt;

ArrayList<OBJECT> yourArray = new Gson().fromJson(jsonString, new TypeToken<List<OBJECT>>().getType());

//or

ArrayList<OBJECT> yourArray = new Gson().fromJson(myjsonarray.toString(), new TypeToken<List<OBJECT>>().getType());

在将ArrayList&lt;OBJECT&gt; 转换为 JsonArray 时,无需将其转换为字符串并返回 JsonArray

 JsonArray myjsonarray = new Gson().toJsonTree(MyArrayList<OBJECT>).getAsJsonArray();

请参阅Gson API documentation 了解更多详情。希望这会有所帮助。

【讨论】:

使用自定义列表对象时的简单直接的解决方案。【参考方案2】:

JSONArray 只是对象的一个​​子类,所以如果你想从 JSONArray 中获取 JSONObjects 到其他形式,JSONArray 没有任何方便的方法来做到这一点,所以你必须获取每个 JSONObject 并填充你的ArrayList 自己。

这是一个简单的方法:

ArrayList<JSONObject> arrayList = new ArrayList(myJSONArray.length());
for(int i=0;i < myJSONArray.length();i++)
    arrayList.add(myJSONArray.getJSONObject(i));

编辑:

好的,您编辑了代码以表明您正在使用 GSON。那是一匹不同颜色的马。如果使用 com.google.gson.JsonArray 而不是 JSONArray,则可以使用 Gson.fromJson() 方法获取 ArrayList。

这是一个链接:Gson - convert from Json to a typed ArrayList

【讨论】:

这不是我要找的。如果你能帮助我,我已经编辑了这个问题。 令人沮丧的事实是JSONArray 已经在内部使用了ArrayList,但那个是私有的。【参考方案3】:

很遗憾,这需要您做一些工作。 Gson 不支持反序列化任意对象的通用集合。 Gson 用户指南主题Serializing and Deserializing Collection with Objects of Arbitrary Types 列出了三个选项来做你想做的事。引用指南的相关部分:

您可以使用 Gson 序列化集合而无需执行任何特定操作:toJson(collection) 会写出所需的输出。 但是,使用fromJson(json, Collection.class) 进行反序列化将不起作用,因为 Gson 无法知道如何将输入映射到类型。 Gson 要求您在 fromJson 中提供集合类型的通用版本。所以,你有三个选择:

选项 1:使用 Gson 的解析器 API(低级流解析器或 DOM 解析器 JsonParser)解析数组元素,然后在每个数组元素上使用Gson.fromJson()。这是首选方法。 Here is an example 演示了如何执行此操作。

选项 2:为 Collection.class 注册一个类型适配器,该适配器查看每个数组成员并将它们映射到适当的对象。这种方法的缺点是它会搞砸 Gson 中其他集合类型的反序列化。

选项 3:为MyCollectionMemberType 注册一个类型适配器并将fromJsonCollection&lt;MyCollectionMemberType&gt; 一起使用 仅当数组显示为***元素或您可以将保存集合的字段类型更改为 Collection&lt;MyCollectionMemberType&gt; 类型时,此方法才实用。

有关这三个选项的详细信息,请参阅文档。

【讨论】:

【参考方案4】:

我们从转换开始[ JSONArray -> List ]

public static List<JSONObject> getJSONObjectListFromJSONArray(JSONArray array) 
        throws JSONException 
  ArrayList<JSONObject> jsonObjects = new ArrayList<>();
  for (int i = 0; 
           i < (array != null ? array.length() : 0);           
           jsonObjects.add(array.getJSONObject(i++)) 
       );
  return jsonObjects;

接下来创建通用版本,用 POJO 替换 array.getJSONObject(i++)

示例:

public <T> static List<T> getJSONObjectListFromJSONArray(Class<T> forClass, JSONArray array) 
        throws JSONException 
  ArrayList<Tt> tObjects = new ArrayList<>();
  for (int i = 0; 
           i < (array != null ? array.length() : 0);           
           tObjects.add( (T) createT(forClass, array.getJSONObject(i++))) 
       );
  return tObjects;


private static T createT(Class<T> forCLass, JSONObject jObject) 
   // instantiate via reflection / use constructor or whatsoever 
   T tObject = forClass.newInstance(); 
   // if not using constuctor args  fill up 
   // 
   // return new pojo filled object 
   return tObject;

【讨论】:

【参考方案5】:

试试这个,

ArrayList<**YOUCLASS**> **YOURARRAY** = 
new Gson().fromJson(oldJSONArray.toString(), 
new TypeToken<List<**yourClass**>>().getType());

【讨论】:

以上是关于从 JSONArray 转换为 ArrayList<CustomObject> - Android的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Kotlin 中将 ArrayList 转换为 JSONArray()

将 ArrayList<MyCustomClass> 转换为 JSONArray

Java 语言 ArrayList 和 JSONArray 相互转换

如何在 Android 中将 JSONArray 转换为 ListView? [复制]

从 JSONArray 转换为 String 然后再转换回来

将 Json Array 转换为普通 Java 列表