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!

TheGeekNess
quelle
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));
   } 
} 
Sagar Maiyad
quelle
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\": \"[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;
}

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.

Hiren Patel
quelle
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) );
Sunil Kumar
quelle
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);
Brianianey
quelle
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);
Vasilii Suricov
quelle
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())
Anant Simran Singh
quelle
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++)));
Sorter
quelle
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);
R9J
quelle
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;
kunal khedkar
quelle
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.

Mehul Boghra
quelle
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());
Min Hyoung Hong
quelle
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;
}
ceph3us
quelle
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);
Bheem Singh
quelle
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"));
yoAlex5
quelle
0
ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
 listdata.addAll(jArray);
}

@ vereinfacht

Naveen Sunkavalli
quelle
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);
Prem Abhisek
quelle
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());
Vivek Dhayaal
quelle