我将一个ArrayList转换为JSONArray,如何将其转换回ArrayList?
最终结果必须是一个ArrayList。谢谢您提前的帮助。
编辑:
这是我将ArrayList转换为JSONArray的方法:
String string_object= new Gson().toJson(MyArrayList<OBJECT>);
JSONArray myjsonarray = new JSONArray(string_object);
我将一个ArrayList转换为JSONArray,如何将其转换回ArrayList?
最终结果必须是一个ArrayList。谢谢您提前的帮助。
编辑:
这是我将ArrayList转换为JSONArray的方法:
String string_object= new Gson().toJson(MyArrayList<OBJECT>);
JSONArray myjsonarray = new JSONArray(string_object);
使用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文档以获取更多详细信息。希望这对您有所帮助。
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
JSONArray
已经在内部使用了 ArrayList
,但该成员是私有的。 - luckydonaldtoJson(collection)
将写出所需的输出。但是,使用fromJson(json, Collection.class)
进行反序列化将不起作用,因为Gson无法知道如何将输入映射到类型。Gson要求您在fromJson
中提供一个泛型版本的集合类型。因此,您有三个选项:
选项1:使用Gson的解析器API(低级流解析器或DOM解析器JsonParser)解析数组元素,然后在每个数组元素上使用Gson.fromJson()
。这是首选方法。这里有一个示例演示了如何做到这一点。
选项2:为Collection.class
注册一个类型适配器,该适配器查看每个数组成员并将其映射到适当的对象。这种方法的缺点是它会破坏Gson中其他集合类型的反序列化。
选项3:为MyCollectionMemberType
注册一个类型适配器,并使用fromJson
与Collection<MyCollectionMemberType>
。只有当数组出现为顶级元素或者您可以将持有集合的字段类型更改为Collection<MyCollectionMemberType>
类型时,此方法才是实用的。
请查看文档,了解三个选项的详细信息。
ArrayList<**YOUCLASS**> **YOURARRAY** =
new Gson().fromJson(oldJSONArray.toString(),
new TypeToken<List<**yourClass**>>(){}.getType());
我们从转换 [ 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;
}