从 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 @DavidStanete 请参考下面我的回答,了解使用 Google 的 Gson 库将 JsonArray 转换为 ArrayList您可以使用下面的 Gson 库将您的 JsonArray 或 json 字符串转换为 ArrayList<OBJECT>
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<OBJECT>
转换为 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
注册一个类型适配器并将fromJson
与Collection<MyCollectionMemberType>
一起使用 仅当数组显示为***元素或您可以将保存集合的字段类型更改为Collection<MyCollectionMemberType>
类型时,此方法才实用。
有关这三个选项的详细信息,请参阅文档。
【讨论】:
【参考方案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? [复制]