我将ArrayList转换为JSONArray。我怎样才能将其转换回来?
最终结果必须是ArrayList。提前谢谢。
编辑:
这是我将ArrayList转换为JSONArray的方式:
String string_object= new Gson().toJson(MyArrayList<OBJECT>);
JSONArray myjsonarray = new JSONArray(string_object);
答案 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。
答案 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
注册类型适配器,并将fromJson
与Collection<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());