Konvertieren von JSONarray in ArrayList


104

Ich lade eine JSON-Zeichenfolge herunter und konvertiere sie in JSONArray. Ich stelle es in eine Listenansicht und muss es später aus dieser Listenansicht löschen können. Da JSONArray keine .remove-Methode hat (Danke Obama), versuche ich, es in eine Arrayliste umzuwandeln.

Hier ist mein JSON (das 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"}]

Ich muss es in ein Array bringen und in der Lage sein, die Zeichenfolgen über ihre jeweiligen Schlüssel aufzurufen. Schätzen Sie jede Hilfe!


Wenn Sie Schlüssel sagen, bedeutet das nicht ein Wörterbuch (Map in Android)? Ein Array wird indexbasiert sein. Informationen zum Erstellen und Verwenden finden Sie unter developer.android.com/reference/java/util/Map.html .
Brianestey

Kann eine Karte verwendet werden, um eine Listenansicht mit einem benutzerdefinierten Basisadapter zu füllen? Ich verwende lieber keine Indizes, falls der JSON jemals die Reihenfolge ändert.
TheGeekNess

ListView ruft Objekte vom Index nach Adapter ab, sodass Sie die Liste in jedem Fall in einer bestimmten Reihenfolge pflegen müssen. Wenn Sie die Reihenfolge der Schlüssel beibehalten möchten (und wissen möchten, wie sich die Schlüssel zur Kompilierungszeit befinden), können Sie ein Array dieser Schlüssel in der gewünschten Reihenfolge fest codieren und diese für Ihre Bestellung beim Abrufen von der Karte verwenden.
Brianestey

Antworten:


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
Und listdata.add(jArray.optJSONObject(i));wenn Ihre Listendaten eine JSONObject-ArrayList sind. ArrayList<JSONObject> listdata = new ArrayList<JSONObject>();
Subin Sebastian

2
Guter Ausschnitt. Nur für den Fall, dass jemand möchte: Es gibt eine Hilfsklasse, die JSONObject / JSONArray in eine Standardkarte / -liste auf dem github gist.github.com/codebutler/2339666 konvertiert
exccii

2
Warum nicht ein ArrayList<Object>?
Natanavra

Wie kann ich mit dem Json Array umgehen? Ist leer. Bitte antworte mir, Bruder.
MohanRaj S

3
Gibt es eine andere Möglichkeit, dies ohne Schleife zu tun?
K.Sopheak

64

Ich habe es mit Gson(von Google) gemacht .

Fügen Sie Ihrem Modul die folgende Zeile hinzu 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 Zeichenfolge:

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

Code zum Konvertieren einer JSON-Zeichenfolge in ArrayList<Model>:

Hinweis: Sie müssen importieren 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);
    }
}

Hoffe das wird dir helfen.


4
DREI LINIEN ... FERTIG! Ich denke, dies hätte die akzeptierte Antwort sein sollen, da (a) nur drei Codezeilen hervorragend funktionieren und (b) nur wenige der Antworten tatsächlich eine typisierte Übersetzung von JSONArray in List <CustomObject> ausführen. Danke dir!
John Ward

Es muss ein JSONArray sein, das JSONElement scheint nicht zu funktionieren. Verwenden Sie die getAsJsonArray()Methode also anscheinend. Danke dir!
恒 陶

1
Genau das, was ich brauchte, danke! Hinweis: Sie müssen diese importieren: java.lang.reflect.Type; com.google.gson.reflect.TypeToken;
Chandrani H

Genial, das hätte die akzeptierte Antwort sein sollen!. Danke
Yeuni

Dies funktioniert nicht, wenn gesagt wird, dass Init von Typetoken geschützt ist
Nikoss

7

Versuchen Sie es auf diese Weise. Führen Sie einfach eine Schleife durch und erstellen Sie Ihr eigenes Array. Bei diesem Code wird davon ausgegangen, dass es sich um ein Array von Zeichenfolgen handelt. Es sollte nicht schwierig sein, diese an Ihre spezielle Array-Struktur anzupassen.

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

Anstatt die JSON-Zeichenfolge in eine ArrayList oder sogar eine Map zu konvertieren, können Sie einfach selbst ein JSONObject erstellen . Dieses Objekt kann nach Belieben Zeichenfolgenwerte per Schlüssel abrufen und Objekte entfernen .

Um eine JSONObjectaus einer richtig formatierten JSON-Zeichenfolge zu erstellen , rufen Sie einfach den entsprechenden Konstruktor auf .

JSONObject json = new JSONObject(jsonString);

1
Das Problem, auf das ich insbesondere bei dieser Lösung stoße, ist, dass sie beim Umgang mit JSONObject und JSONArray JSONException auslösen. Manchmal ist es praktisch, den Inhalt eines JSONArray an eine Funktion zu übergeben, die JSON nicht kennen muss.
Aaron Dougherty

2
Genau. Ich würde das JSONObject als Teil des Parsens des JSON-Textes in ein verwendbares Modellobjekt verwenden. Jede JSONE-Ausnahme, die ausgelöst wird, weist auf ein Problem mit dem Quell-JSON hin. Dies bedeutet, dass Sie es nicht in ein JSONArray oder JSONObject analysieren können, geschweige denn in ein anderes Modellobjekt.
Brianestey

6

Ich habe eine schnelle Lösung. Erstellen Sie einfach eine DateiArrayUtil.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);
    }

}

Verwendung:

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

oder

JSONArray jArr = ArrayUtil.convert(list);

Was mache ich, wenn ich einenArrayList<String>

Ich denke, es ist nicht möglich, ArrayList <Object> in ArrayList <String>
umzuwandeln

1
Ein großes Lob an diese Antwort. Du hast meinen Tag gelöst! Ich habe 2 Stunden damit verbracht, dies zu beheben. Eigentlich war mein Problem, dass ich das konvertierte JSONArrayin eine Liste einfügen wollte, damit ich das Listin eine HashMapeinfügen konnte , also funktionierte dieses Util für mich ziemlich gut. Danke @Vasilii Suricov
Jose Mhlanga

5

In Java 8

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

1
Das einzige Problem dabei ist, dass JSONArray.getString (...) eine Ausnahme auslöst, die innerhalb des Mappings behandelt werden muss, sodass Sie am Ende 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());nicht mehr so ​​elegant sind. Also werde ich mit einem foreach gehen :)
LazR

Dies ist die beste Antwort hier (imho), wäre aber elegant, wenn es eine Möglichkeit gäbe, nicht mehr als einmal auf die jsonArray-Referenz zugreifen zu müssen.
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

Verwenden Sie POJO, um es praktisch zu machen.

versuche es so ..

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

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

yourPojos.add(yourPojo);

1

Mit 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

Wenn Sie Daten aus einem JSON-String-Array extrahieren möchten, finden Sie hier meinen Arbeitscode. Ändern Sie den Parameter als Ihre Daten.


PoJo-Klasse

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

Extrahieren Sie Ihre Daten mit der folgenden Codezeile

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

Sie erhalten eine Liste der PoJo-Klassenobjekte.


1

Java 8-Stil

   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

Ich habe eine schnelle Lösung. Erstellen Sie einfach eine DateiArrayUtil.java

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

Verwendung:

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

oder

JSONArray jArr = ArrayUtil.convert(list);

0

Generische Variante

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

@ vereinfacht


0

Gehen Sie einfach zum ursprünglichen Thema des Threads:

Konvertieren von Jsonarray in Liste (hier verwendet Jackson Jsonarray und Object Mapper):

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

0

Eine einfachere Java 8-Alternative:

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());
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.