Conversione di JSONarray in ArrayList


104

Sto scaricando una stringa JSON e convertendola in JSONArray. Lo sto inserendo in un listview e devo essere in grado di eliminarlo da quel listview in un secondo momento, e poiché JSONArray non ha un metodo .remove (grazie Obama), sto cercando di convertirlo in un arraylist.

ecco il mio 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"}]

Devo inserirlo in un array ed essere in grado di chiamare le stringhe con le rispettive chiavi. Apprezzo qualsiasi aiuto!


Quando dici chiavi, non significa un dizionario (mappa in Android) di qualche tipo? Un array sarà basato sull'indice. Dai un'occhiata a developer.android.com/reference/java/util/Map.html per come creare e utilizzare.
brianestey

È possibile utilizzare una mappa per popolare una visualizzazione elenco con un baseadapter personalizzato? Preferisco non utilizzare gli indici nel caso in cui il JSON cambi mai ordine.
TheGeekNess

ListView otterrà gli oggetti dall'adattatore per indice, quindi in ogni caso sarà necessario mantenere l'elenco in un certo ordine. Se vuoi mantenere l'ordine delle chiavi (e sapere quali sono le chiavi in ​​fase di compilazione), puoi codificare un array di quelle chiavi nell'ordine che preferisci e usarlo per il tuo ordine durante il recupero dalla mappa.
brianestey

Risposte:


164
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
E listdata.add(jArray.optJSONObject(i));se il tuo listdata è un arrayList JSONObject. ArrayList<JSONObject> listdata = new ArrayList<JSONObject>();
Subin Sebastian

2
Buon snippet. Per ogni evenienza, se qualcuno vuole: c'è una classe helper che converte JSONObject / JSONArray in una mappa / elenco standard su github gist.github.com/codebutler/2339666
inexcii

2
Perché non utilizzare un ArrayList<Object>?
natanavra

Come posso gestire il Json Array è vuoto. per favore rispondimi fratello.
MohanRaj S

3
C'è un altro modo per farlo senza loop?
K.Sopheak,

64

L'ho fatto usando Gson(di Google) .

Aggiungi la seguente riga a quella del tuo modulo build.gradle:

dependencies {
  // ...
  // Note that `compile` will be deprecated. Use `implementation` instead.
  // See https://stackoverflow.com/a/44409111 for more info
  implementation 'com.google.code.gson:gson:2.8.2'
}

JSON corda:

private String jsonString = "[\n" +
            "        {\n" +
            "                \"id\": \"c200\",\n" +
            "                \"name\": \"Ravi Tamada\",\n" +
            "                \"email\": \"ravi@gmail.com\",\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\": \"johnny_depp@gmail.com\",\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\": \"leonardo_dicaprio@gmail.com\",\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\": \"john_wayne@gmail.com\",\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\": \"angelina_jolie@gmail.com\",\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\": \"dido@gmail.com\",\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\": \"adele@gmail.com\",\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\": \"hugh_jackman@gmail.com\",\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\": \"will_smith@gmail.com\",\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\": \"clint_eastwood@gmail.com\",\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\": \"barack_obama@gmail.com\",\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\": \"kate_winslet@gmail.com\",\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\": \"eminem@gmail.com\",\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;
}

Codice per convertire una stringa JSON in ArrayList<Model>:

Nota: devi importare java.lang.reflect.Type;:

// Top of file
import java.lang.reflect.Type;

// ...

private void parseJSON() {
    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);
    }
}

Spero che questo ti possa aiutare.


4
TRE LINEE ... FATTE! Penso che questa avrebbe dovuto essere la risposta accettata poiché (a) sono solo tre righe di codice che funzionano magnificamente e (b) alcune delle risposte eseguono effettivamente una traduzione digitata da JSONArray a List <CustomObject>. Grazie!
John Ward

Deve essere un JSONArray, JSONElement sembra non funzionare. quindi, usa il getAsJsonArray()metodo apparentemente. Grazie!
嘉 恒 陶

1
Esattamente quello di cui avevo bisogno, grazie! Nota: devi importare questi: java.lang.reflect.Type; com.google.gson.reflect.TypeToken;
Chandrani H

Fantastico, questa avrebbe dovuto essere la risposta accettata !. Grazie
Yeuni

questo non funziona dicendo che init di typetoken è protetto
Nikoss

7

prova in questo modo Esegui semplicemente il ciclo, creando il tuo array. Questo codice presuppone che sia un array di stringhe, non dovrebbe essere difficile da modificare per adattarlo alla tua particolare struttura di array.

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

Invece di convertire la stringa JSON in un ArrayList o anche in una mappa, puoi semplicemente creare un JSONObject stesso. Questo oggetto ha la capacità di ottenere valori di stringa per chiave , come vuoi e anche di rimuovere oggetti .

Per creare un JSONObjectda una stringa JSON formattata correttamente, è sufficiente chiamare il costruttore appropriato .

JSONObject json = new JSONObject(jsonString);

1
Il problema in cui mi imbatto con questa soluzione in particolare è che quando si tratta di JSONObject e JSONArray è che lanciano JSONException. A volte è utile passare il contenuto di un JSONArray a una funzione che non dovrebbe essere a conoscenza di JSON.
Aaron Dougherty

2
Sono d'accordo. Vorrei utilizzare JSONObject come parte dell'analisi del testo JSON in un oggetto modello utilizzabile. Qualsiasi JSONException sollevata indicherebbe un problema con il JSON di origine, il che significa che non è possibile analizzarlo in un JSONArray o JSONObject, per non parlare di un oggetto modello diverso.
brianestey

6

Ho una soluzione veloce. Basta creare un fileArrayUtil.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);
    }

}

Uso:

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

o

JSONArray jArr = ArrayUtil.convert(list);

Cosa devo fare se è necessario restituire unArrayList<String>

Penso che non sia possibile lanciare ArrayList <Object> a ArrayList <String>
Vasilii Suricov

1
Complimenti per questa risposta. Hai risolto la mia giornata! Ho passato 2 ore cercando di risolvere questo problema. In realtà il mio problema era che volevo mettere il convertito JSONArrayin una lista in modo da poterlo mettere Listin a HashMap, quindi questo util ha funzionato abbastanza bene per me. Grazie @Vasilii Suricov
Jose Mhlanga il

5

In Java 8,

IntStream.range(0,jsonArray.length()).mapToObj(i->jsonArray.getString(i)).collect(Collectors.toList())

1
L'unico problema con questo è che JSONArray.getString (...) genera un'eccezione che deve essere gestita all'interno della mappatura, quindi si finisce con il fatto List<String> listOfStrings = IntStream.range(0, array.length()).mapToObj(i -> { try { return array.getString(i); } catch (JSONException e) { throw new AssertionFailedError("JSONArray is not a list of Strings! " + e.getMessage()); } }).collect(Collectors.toList());che non è più così elegante. Quindi andrò con un foreach :)
LazR

Questa è la migliore risposta qui (imho) ma sarebbe elegante se ci fosse un modo per non dover accedere al riferimento jsonArray più di una volta.
Djangofan

4
 JSONArray array = new JSONArray(json);
 List<JSONObject> list = new ArrayList();
 for (int i = 0; i < array.length();list.add(array.getJSONObject(i++)));

2

Per renderlo pratico, usa POJO.

prova così ..

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

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

yourPojos.add(yourPojo);

1

Utilizzando Gson

    List<Student> students = new ArrayList<>();
    JSONArray jsonArray = new JSONArray(stringJsonContainArray);
    for (int i = 0; i < jsonArray.length(); i++) {
        Student student = new Gson().fromJson(jsonArray.get(i).toString(), Student.class);
        students.add(student);
    }
    return students;

1

se vuoi estrarre i dati dalla matrice di stringhe JSON, ecco il mio codice funzionante. modificare il parametro come dati.


Classe PoJo

public class AllAppModel {
    private String appName;
    private String packageName;
    private int uid;
    private boolean isSelected;
    private boolean isSystemApp;
    private boolean isFav;
}

Estrai i tuoi dati utilizzando la riga di codice sottostante

try {
    JSONArray jsonArr = new JSONArray("Your json string array");
    List<AllAppModel> lstExtrextData = new ArrayList<>();
    for (int i = 0; i < jsonArr.length(); i++) {
        JSONObject jsonObj = jsonArr.getJSONObject(i);
        AllAppModel data = new AllAppModel();
        data.setAppName(jsonObj.getString("appName"));
        data.setPackageName(jsonObj.getString("packageName"));
        data.setUid(jsonObj.getInt("uid"));
        data.setSelected(jsonObj.getBoolean("isSelected"));
        data.setSystemApp(jsonObj.getBoolean("isSystemApp"));
        data.setFav(jsonObj.getBoolean("isFav"));
        lstExtrextData.add(data);
    }
} catch (JSONException e) {
    e.printStackTrace();
}

ti restituirà List of PoJo class object.


1

Stile Java 8

   JSONArray data = jsonObject.getJSONArray("some-node");

   List<JSONObject> list = StreamSupport.stream(data.spliterator(), false)
                .map(e -> (JSONObject)e)
                .collect(Collectors.toList());

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

0

Ho una soluzione veloce. Basta creare un fileArrayUtil.java

ObjectMapper mapper = new ObjectMapper(); 
List<Student> list = Arrays.asList(mapper.readValue(jsonString, Student[].class));

Uso:

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

o

JSONArray jArr = ArrayUtil.convert(list);

0

Variante generica

public static <T> List<T> getList(JSONArray jsonArray) throws Exception {

    List<T> list = new ArrayList<>(jsonArray.length());

    for (int i = 0; i < jsonArray.length(); i++) {

        list.add((T)jsonArray.get(i));
    }

    return list;

}

//Usage

List<String> listKeyString = getList(dataJsonObject.getJSONArray("keyString"));

0
ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
 listdata.addAll(jArray);
}

@simplified


0

Andando solo dall'oggetto originale del thread:

conversione di jsonarray in list (usato jackson jsonarray e object mapper qui):

ObjectMapper mapper = new ObjectMapper();
JSONArray array = new JSONArray();
array.put("IND");
array.put("CHN");
List<String> list = mapper.readValue(array.toString(), List.class);

0

Un'alternativa più semplice a Java 8:

JSONArray data = new JSONArray(); //create data from this -> [{"thumb_url":"tb-1370913834.jpg","event_id":...}]

List<JSONObject> list = data.stream().map(o -> (JSONObject) o).collect(Collectors.toList());
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.