从JSONArray转换为ArrayList <customobject> - Android </customobject>

时间:2014-02-23 00:19:37

标签: android json parsing arraylist typeconverter

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

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

编辑:

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

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

5 个答案:

答案 0 :(得分:28)

您可以使用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。希望这会有所帮助。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

不幸的是,这需要您做一些工作。 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<MyCollectionMemberType>一起使用   仅当数组显示为顶级元素或者您可以将包含集合的字段类型更改为Collection<MyCollectionMemberType>类型时,此方法才可用。

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

答案 3 :(得分:0)

我们从转化开始[JSONArray - &gt;列表&lt; JSONObject&gt; ]

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

答案 4 :(得分:0)

尝试一下

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