it-swarm.com.ru

Конвертировать из JSONArray в ArrayList <CustomObject> - Android

Я преобразовал ArrayList в JSONArray. Как я могу преобразовать его обратно?

Конечный результат должен быть ArrayList. Заранее спасибо.

Правка:

Вот как я конвертирую ArrayList в JSONArray:

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

Вы можете преобразовать вашу строку JsonArray или json в ArrayList<OBJECT>, используя библиотеку Gson, как показано ниже

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 для более подробной информации. Надеюсь, это будет полезно.

25
Uttam

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

Правка:

Хорошо, вы отредактировали свой код, чтобы показать, что вы используете GSON. Это лошадь другого цвета. Если вы используете com.google.gson.JsonArray вместо JSONArray, вы можете использовать метод Gson.fromJson () для получения ArrayList.

Вот ссылка: Gson - конвертировать из Json в типизированный ArrayList

3
David C Adams

К сожалению, это потребует небольшой работы с вашей стороны. Gson не поддерживает десериализацию общих коллекций произвольных объектов. Тема Руководства пользователя Gson Сериализация и десериализация коллекции с объектами произвольных типов перечислите три варианта выполнения того, что вы хотите. Чтобы процитировать соответствующие части руководства:

Вы можете сериализовать коллекцию с помощью Gson, не делая ничего конкретного: toJson(collection) выпишет желаемый результат . Однако десериализация с fromJson(json, Collection.class) не будет работать, поскольку у Gson нет возможности узнать, как сопоставить входные данные с типами. Gson требует, чтобы вы предоставили обобщенную версию типа коллекции в fromJson. Итак, у вас есть три варианта:

Вариант 1: используйте API синтаксического анализатора Gson (низкоуровневый потоковый анализатор или анализатор DOM JsonParser) для анализа элементов массива, а затем используйте Gson.fromJson() для каждого из элементов массива. Это предпочтительный подход. Вот пример , который демонстрирует, как это сделать.

Вариант 2: Зарегистрируйте адаптер типа для Collection.class, который просматривает каждого из элементов массива и сопоставляет их с соответствующими объектами. Недостаток этого подхода в том, что он испортит десериализацию других типов коллекций в Gson.

Вариант 3: зарегистрируйте адаптер типа для MyCollectionMemberType и используйте fromJson с Collection<MyCollectionMemberType> Этот подход практичен, только если массив отображается как элемент верхнего уровня или если вы можете изменить тип поля, содержащего коллекцию, на тип Collection<MyCollectionMemberType>.

См. Документы для деталей о каждом из трех вариантов.

1
Ted Hopp

мы начинаем с преобразования [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;
}
0
ceph3us