Конвертировать из 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;
}