Конвертировать из JSONArray в ArrayList-Android
я преобразовал ArrayList в JSONArray. Как я могу преобразовать его обратно?
конечный результат должен быть ArrayList. Заранее спасибо.
изменить:
вот как я преобразую ArrayList в JSONArray:
String string_object= new Gson().toJson(MyArrayList<OBJECT>);
JSONArray myjsonarray = new JSONArray(string_object);
4 ответов
вы можете преобразовать строку 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();
см. документация по API Gson для получения более подробной информации. Надеюсь, это будет полезно.
JSONArray - это просто подкласс объекта, поэтому, если вы хотите получить JSONObjects из JSONArray в другую форму, у JSONArray нет удобного способа сделать это, поэтому вам нужно получить каждый JSONObject и заполнить свой ArrayList самостоятельно.
вот простой способ сделать это:
ArrayList<JSONObject> arrayList = new ArrayList(myJSONArray.length());
for(int i=0;i < myJSONArray.length();i++){
arrayList.add(myJSONArray.getJSONObject(i));
}
изменить:
OK, вы отредактировали код, чтобы показать, что используете GSON. Это лошадь другого цвета. Если вы используете com.гуглить.гсон.JsonArray вместо JSONArray, вы можете использовать Gson.метод fromJson () для получения ArrayList.
вот ссылка: Gson-преобразовать из Json в типизированный ArrayList
к сожалению, это потребует немного работы с вашей стороны. Gson не поддерживает десериализацию общих коллекций произвольных объектов. Раздел руководства пользователя Gson сериализация и десериализация коллекции с объектами произвольных типов перечислите три варианта выполнения того, что вы хотите. Чтобы процитировать соответствующие части руководства:
вы можете сериализовать коллекцию с помощью Gson, не делая ничего конкретного:
toJson(collection)
выпишет желаемое выход. Однако десериализация сfromJson(json, Collection.class)
не будет работать, так как Gson не знает, как сопоставить входные данные с типами. Дсын требует, чтобы вы предоставляете genericised версия тип коллекции вfromJson
. Итак, у вас есть три варианта:1: используйте API парсера Gson (низкоуровневый потоковый парсер или парсер DOM JsonParser) для анализа элементов массива, а затем используйте
Gson.fromJson()
на каждом из элементов массива. Это предпочтительный подход. вот пример это демонстрирует, как это сделать.2 зарегистрировать адаптер типа
Collection.class
, который смотрит на каждого из членов массива и сопоставляет их с соответствующими объектами. Недостатком этого подхода является то, что он испортит десериализацию других типов коллекций в Gson.3 зарегистрировать адаптер типа
MyCollectionMemberType
и использоватьfromJson
СCollection<MyCollectionMemberType>
Этот подход является только практическим если массив отображается как элемент верхнего уровня или если можно изменить тип поля, содержащего коллекцию, на типCollection<MyCollectionMemberType>
.
подробные сведения о каждом из трех вариантов см. В документах.
мы начинаем с преобразования [ 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;
}
далее создать общую версию, заменяющую массив.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;
}