从JSONArray转换为ArrayList<CustomObject> - Android

12

我将一个ArrayList转换为JSONArray,如何将其转换回ArrayList?

最终结果必须是一个ArrayList。谢谢您提前的帮助。

编辑:

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

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

一个什么的ArrayList?你是如何将它转换为JSONArray的? - Ted Hopp
我已经创建了自己的对象,并用3个对象填充了一个ArrayList。我首先将我的ArrayList转换为JSONArray,然后想将其转换回ArrayList。有什么建议吗? - stanete
不了解转换过程的情况下,唯一的提示就是:以相反的方式运行转换过程。 - Ted Hopp
我编辑了这篇帖子,展示了如何将ArrayList <OBJECT>转换为JSONArray。它起作用了。但是如何将它转换回来呢? - stanete
@DavidStanete 参考我下面的答案,使用Google的Gson库将你的JsonArray转换为ArrayList<CustomObject>的最简单方法。 - Purushotham
5个回答

44

使用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文档以获取更多详细信息。希望这对您有所帮助。


1
当您使用自定义列表对象时,这是一个简单而直接的解决方案。 - Sachidananda Naik

3

JSONArray是Object的一个子类,因此如果您想将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 - 将Json转换为类型化的ArrayList


这不是我想要的。如果你能帮我,我已经编辑了问题。 - stanete
1
令人沮丧的事实是,JSONArray 已经在内部使用了 ArrayList,但该成员是私有的。 - luckydonald

1
很抱歉,这需要您做一些工作。 Gson不支持反序列化任意对象的通用集合。 Gson用户指南主题 使用任意类型的对象序列化和反序列化集合列出了三种选项以满足您的需求。引用指南中相关部分:“
您可以使用Gson序列化集合而不需要进行任何特定操作:toJson(collection)将写出所需的输出。但是,使用fromJson(json, Collection.class)进行反序列化将不起作用,因为Gson无法知道如何将输入映射到类型。Gson要求您在fromJson中提供一个泛型版本的集合类型。因此,您有三个选项: 选项1:使用Gson的解析器API(低级流解析器或DOM解析器JsonParser)解析数组元素,然后在每个数组元素上使用Gson.fromJson()。这是首选方法。这里有一个示例演示了如何做到这一点。 选项2:为Collection.class注册一个类型适配器,该适配器查看每个数组成员并将其映射到适当的对象。这种方法的缺点是它会破坏Gson中其他集合类型的反序列化。 选项3:为MyCollectionMemberType注册一个类型适配器,并使用fromJsonCollection<MyCollectionMemberType>。只有当数组出现为顶级元素或者您可以将持有集合的字段类型更改为Collection<MyCollectionMemberType>类型时,此方法才是实用的。

请查看文档,了解三个选项的详细信息。


0
尝试一下这个,
ArrayList<**YOUCLASS**> **YOURARRAY** = 
new Gson().fromJson(oldJSONArray.toString(), 
new TypeToken<List<**yourClass**>>(){}.getType());

0

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

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;
}

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

示例:

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接