2013-06-11 6 views
58

Я загружаю строку JSON и преобразовываю ее в JSONArray. Я помещаю его в список и должен быть в состоянии удалить из этого списка позже, а поскольку JSONArray не имеет метода .remove (спасибо Обаме), я пытаюсь преобразовать его в arraylist.Преобразование JSONarray в ArrayList

вот мой JSON (Array.toString()):

[{"thumb_url":"tb-1370913834.jpg","event_id":"15","count":"44","event_tagline":"this is a tagline","event_name":"5th birthday","event_end":"1370919600","event_start":"1370876400"}] 

мне нужно, чтобы получить его в массив и быть в состоянии назвать строки их соответствующими ключами. Цените любую помощь!

+0

Когда вы говорите, ключи, не подразумевает, что Словарь (карта в Android) какой-то? Массив будет основан на индексе. Взгляните на http://developer.android.com/reference/java/util/Map.html, как создавать и использовать. – brianestey

+0

Можно ли использовать карту для заполнения списка с помощью настраиваемого базового адаптера? Идентификатор скорее не использует индексы, если JSON когда-либо изменяет порядок. – TheGeekNess

+0

ListView получит объекты от адаптера по индексу, поэтому в любом случае вам нужно будет сохранить список в определенном порядке. Если вы хотите сохранить порядок ключей (и знать, какие ключи находятся во время компиляции), вы можете жестко закодировать массив этих ключей в том порядке, который вам нравится, и использовать его для вашего заказа при извлечении из Карты. – brianestey

ответ

107
ArrayList<String> listdata = new ArrayList<String>();  
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
    for (int i=0;i<jArray.length();i++){ 
    listdata.add(jArray.getString(i)); 
    } 
} 
+3

И 'listdata.add (jArray.optJSONObject (i));' если ваш listdata является списком массивов JSONObject. 'ArrayList listdata = new ArrayList (); ' –

+2

Хороший сниппет. На всякий случай, если кому-то захочется: есть вспомогательный класс, который преобразует JSONObject/JSONArray в стандартный Map/List на github https://gist.github.com/codebutler/2339666 – inexcii

+2

Почему бы не использовать 'ArrayList '? – natanavra

5

попробовать этот путь Simply петлю через что, создать свой собственный массив. Этот код предполагает, что это массив строк, его не должно быть сложно модифицировать в соответствии с вашей конкретной структурой массива.

JSONArray jsonArray = new JSONArray(jsonArrayString); 
List<String> list = new ArrayList<String>(); 
for (int i=0; i<jsonArray.length(); i++) { 
    list.add(jsonArray.getString(i)); 
6

Вместо преобразования строки JSON к ArrayList или даже карту, вы можете просто создать сам JSONObject. Этот объект имеет возможность get string values by key, как вы хотите, а также remove objects.

Чтобы создать JSONObject из правильно отформатированной строки JSON, вы просто вызываете appropriate constructor.

JSONObject json = new JSONObject(jsonString); 
+0

Проблема, с которой я сталкиваюсь с этим решением, в частности, заключается в том, что при работе с JSONObject и JSONArray's они бросают JSONException. Иногда удобно передавать содержимое JSONArray в функцию, которая не должна быть осведомлена о JSON. –

+1

Согласен. Я бы использовал JSONObject как часть разбора текста JSON в пригодный для использования объект модели. Любое исключение JSONException указывает на проблему с исходным JSON, то есть вы не можете разобрать его в JSONArray или JSONObject, не говоря уже о другом объекте модели. – brianestey

2

Для удобства использования POJO.

попробовать, как это ..

List<YourPojoObject> yourPojos = new ArrayList<YourPojoObject>(); 

JSONObject jsonObject = new JSONObject(jsonString); 
YourPojoObject yourPojo = new YourPojoObject(); 
yourPojo.setId(jsonObject.getString("idName")); 
... 
... 

yourPojos.add(yourPojo); 
3
JSONArray array = new JSONArray(json); 
List<JSONObject> list = new ArrayList(); 
for (int i = 0; i < array.length();list.add(array.getJSONObject(i++))); 
-1
ArrayList<String> dataList = new ArrayList<String>();  
JSONArray jsonArray = (JSONArray)jsonObject; 
for(Object obj : jsonArray){ 
    dataList.add((String)obj); 
} 
+0

Это не работает. – Tina

27

Я сделал так, используя Gson (библиотеки на Google) для CustomModel класс:

Почему используйте этот код:

  1. Быстрая обработка
  2. Нет необходимости в писать методы Getter сеттер/функции для каждого объекта.
  3. Короткий код
  4. Легко понять

Добавить compile 'com.google.code.gson:gson:2.2.4' в зависимостей блок build.gradle.

Определение JSon Строка:

private String jsonString = "[\n" + 
      "  {\n" + 
      "    \"id\": \"c200\",\n" + 
      "    \"name\": \"Ravi Tamada\",\n" + 
      "    \"email\": \"[email protected]\",\n" + 
      "    \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" + 
      "    \"gender\" : \"male\",\n" + 
      "    \"phone\": {\n" + 
      "     \"mobile\": \"+91 0000000000\",\n" + 
      "     \"home\": \"00 000000\",\n" + 
      "     \"office\": \"00 000000\"\n" + 
      "    }\n" + 
      "  },\n" + 
      "  {\n" + 
      "    \"id\": \"c201\",\n" + 
      "    \"name\": \"Johnny Depp\",\n" + 
      "    \"email\": \"[email protected]\",\n" + 
      "    \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" + 
      "    \"gender\" : \"male\",\n" + 
      "    \"phone\": {\n" + 
      "     \"mobile\": \"+91 0000000000\",\n" + 
      "     \"home\": \"00 000000\",\n" + 
      "     \"office\": \"00 000000\"\n" + 
      "    }\n" + 
      "  },\n" + 
      "  {\n" + 
      "    \"id\": \"c202\",\n" + 
      "    \"name\": \"Leonardo Dicaprio\",\n" + 
      "    \"email\": \"[email protected]\",\n" + 
      "    \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" + 
      "    \"gender\" : \"male\",\n" + 
      "    \"phone\": {\n" + 
      "     \"mobile\": \"+91 0000000000\",\n" + 
      "     \"home\": \"00 000000\",\n" + 
      "     \"office\": \"00 000000\"\n" + 
      "    }\n" + 
      "  },\n" + 
      "  {\n" + 
      "    \"id\": \"c203\",\n" + 
      "    \"name\": \"John Wayne\",\n" + 
      "    \"email\": \"[email protected]\",\n" + 
      "    \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" + 
      "    \"gender\" : \"male\",\n" + 
      "    \"phone\": {\n" + 
      "     \"mobile\": \"+91 0000000000\",\n" + 
      "     \"home\": \"00 000000\",\n" + 
      "     \"office\": \"00 000000\"\n" + 
      "    }\n" + 
      "  },\n" + 
      "  {\n" + 
      "    \"id\": \"c204\",\n" + 
      "    \"name\": \"Angelina Jolie\",\n" + 
      "    \"email\": \"[email protected]\",\n" + 
      "    \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" + 
      "    \"gender\" : \"female\",\n" + 
      "    \"phone\": {\n" + 
      "     \"mobile\": \"+91 0000000000\",\n" + 
      "     \"home\": \"00 000000\",\n" + 
      "     \"office\": \"00 000000\"\n" + 
      "    }\n" + 
      "  },\n" + 
      "  {\n" + 
      "    \"id\": \"c205\",\n" + 
      "    \"name\": \"Dido\",\n" + 
      "    \"email\": \"[email protected]\",\n" + 
      "    \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" + 
      "    \"gender\" : \"female\",\n" + 
      "    \"phone\": {\n" + 
      "     \"mobile\": \"+91 0000000000\",\n" + 
      "     \"home\": \"00 000000\",\n" + 
      "     \"office\": \"00 000000\"\n" + 
      "    }\n" + 
      "  },\n" + 
      "  {\n" + 
      "    \"id\": \"c206\",\n" + 
      "    \"name\": \"Adele\",\n" + 
      "    \"email\": \"[email protected]\",\n" + 
      "    \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" + 
      "    \"gender\" : \"female\",\n" + 
      "    \"phone\": {\n" + 
      "     \"mobile\": \"+91 0000000000\",\n" + 
      "     \"home\": \"00 000000\",\n" + 
      "     \"office\": \"00 000000\"\n" + 
      "    }\n" + 
      "  },\n" + 
      "  {\n" + 
      "    \"id\": \"c207\",\n" + 
      "    \"name\": \"Hugh Jackman\",\n" + 
      "    \"email\": \"[email protected]\",\n" + 
      "    \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" + 
      "    \"gender\" : \"male\",\n" + 
      "    \"phone\": {\n" + 
      "     \"mobile\": \"+91 0000000000\",\n" + 
      "     \"home\": \"00 000000\",\n" + 
      "     \"office\": \"00 000000\"\n" + 
      "    }\n" + 
      "  },\n" + 
      "  {\n" + 
      "    \"id\": \"c208\",\n" + 
      "    \"name\": \"Will Smith\",\n" + 
      "    \"email\": \"[email protected]\",\n" + 
      "    \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" + 
      "    \"gender\" : \"male\",\n" + 
      "    \"phone\": {\n" + 
      "     \"mobile\": \"+91 0000000000\",\n" + 
      "     \"home\": \"00 000000\",\n" + 
      "     \"office\": \"00 000000\"\n" + 
      "    }\n" + 
      "  },\n" + 
      "  {\n" + 
      "    \"id\": \"c209\",\n" + 
      "    \"name\": \"Clint Eastwood\",\n" + 
      "    \"email\": \"[email protected]\",\n" + 
      "    \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" + 
      "    \"gender\" : \"male\",\n" + 
      "    \"phone\": {\n" + 
      "     \"mobile\": \"+91 0000000000\",\n" + 
      "     \"home\": \"00 000000\",\n" + 
      "     \"office\": \"00 000000\"\n" + 
      "    }\n" + 
      "  },\n" + 
      "  {\n" + 
      "    \"id\": \"c2010\",\n" + 
      "    \"name\": \"Barack Obama\",\n" + 
      "    \"email\": \"[email protected]\",\n" + 
      "    \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" + 
      "    \"gender\" : \"male\",\n" + 
      "    \"phone\": {\n" + 
      "     \"mobile\": \"+91 0000000000\",\n" + 
      "     \"home\": \"00 000000\",\n" + 
      "     \"office\": \"00 000000\"\n" + 
      "    }\n" + 
      "  },\n" + 
      "  {\n" + 
      "    \"id\": \"c2011\",\n" + 
      "    \"name\": \"Kate Winslet\",\n" + 
      "    \"email\": \"[email protected]\",\n" + 
      "    \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" + 
      "    \"gender\" : \"female\",\n" + 
      "    \"phone\": {\n" + 
      "     \"mobile\": \"+91 0000000000\",\n" + 
      "     \"home\": \"00 000000\",\n" + 
      "     \"office\": \"00 000000\"\n" + 
      "    }\n" + 
      "  },\n" + 
      "  {\n" + 
      "    \"id\": \"c2012\",\n" + 
      "    \"name\": \"Eminem\",\n" + 
      "    \"email\": \"[email protected]\",\n" + 
      "    \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" + 
      "    \"gender\" : \"male\",\n" + 
      "    \"phone\": {\n" + 
      "     \"mobile\": \"+91 0000000000\",\n" + 
      "     \"home\": \"00 000000\",\n" + 
      "     \"office\": \"00 000000\"\n" + 
      "    }\n" + 
      "  }\n" + 
      " ]"; 

ContactModel.Java:

public class ContactModel{ 
    public String id; 
    public String name; 
    public String email; 
} 

Код для ПреобразованияJSONArray в ArrayList:

Вы должны импортировать java.lang.reflect.Type;:

Gson gson = new Gson(); 
Type type = new TypeToken<List<ContactModel>>(){}.getType(); 
List<ContactModel> contactList = gson.fromJson(jsonString, type); 
for (ContactModel contact : contactList){ 
     Log.i("Contact Details", contact.id + "-" + contact.name + "-" + contact.email); 
} 

Надеется, что это поможет.

+1

ТРИ ЛИНИИ ... СОВЕРШЕННО! Я думаю, что это должен был быть принятый ответ, так как (а) только три строки кода работают красиво, и (б) некоторые ответы фактически выполняют типизированный перевод из JSONArray в List . Спасибо! –

0
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; 
} 
5

У меня есть быстрое решение. Просто создайте файл ArrayUtil.java

import java.util.ArrayList; 
import java.util.Collection; 
import org.json.JSONArray; 
import org.json.JSONException; 

public class ArrayUtil 
{ 
    public static ArrayList<Object> convert(JSONArray jArr) 
    { 
     ArrayList<Object> list = new ArrayList<Object>(); 
     try { 
      for (int i=0, l=jArr.length(); i<l; i++){ 
       list.add(jArr.get(i)); 
      } 
     } catch (JSONException e) {} 

     return list; 
    } 

    public static JSONArray convert(Collection<Object> list) 
    { 
     return new JSONArray(list); 
    } 

} 

Использование:

ArrayList<Object> list = ArrayUtil.convert(jArray); 

или

JSONArray jArr = ArrayUtil.convert(list); 
+0

Что мне делать, если нужно вернуть 'ArrayList ' –

+0

Я думаю, что невозможно отличить ArrayList от ArrayList

+0

Идеальное, быстрое, потрясающее, лучшее решение –

1

В Java 8,

IntStream.range(0,jsonArray.length()).mapToObj(i->jsonArray.getString(i)).collect(Collectors.toList()) 
Смежные вопросы