Konvertieren Sie das Json-Array in eine normale Java-Liste

130

Gibt es eine Möglichkeit, JSON Array in normales Java Array für Android ListView Datenbindung zu konvertieren?

Houston, wir haben ein Problem
quelle
8
Das Lustige ist, dass org.JSONArrayeine ArrayList unter der Haube verwendet wird ... The arrayList where the JSONArray's properties are kept, so dass die meisten Schleifen in vielen Fällen umsonst durchgeführt werden (nur für die Kapselung)
Christophe Roussy

Antworten:

186
ArrayList<String> list = new ArrayList<String>();     
JSONArray jsonArray = (JSONArray)jsonObject; 
if (jsonArray != null) { 
   int len = jsonArray.length();
   for (int i=0;i<len;i++){ 
    list.add(jsonArray.get(i).toString());
   } 
} 
Pentium10
quelle
5
In der for-Schleife fehlt die schließende Klammer ... es wurde versucht, sie zu bearbeiten, aber es sind nicht genügend Zeichen vorhanden, um die Genehmigung zu bestehen. Naja! nur zu Ihrer Information.
Matt K
Da es nicht wirklich fehlt, hat der Antwortende nur einen Teil des Codes mit den offenen und schließenden Klammern der Funktion eingefügt.
Sarim Javaid Khan
1
Was passiert, wenn jsonArray.get(i)null zurückgegeben wird (als Ergebnis der Analyse von :) [ "String 1", null, "String 2" ]? Würde Ihre For-Loop dann nicht abstürzen?
DBM
Vielen Dank. Wenn Sie einen Ring haben, kann JSONArray als JSONArray erstellt werden. JsonArray = new JSONArray (yourString); Der Rest des Codes bleibt gleich.
Kaushik Lele
Abhängig von der Implementierung, die Sie möglicherweise size()anstelle von benötigen length().
Guillaume F.
56

Wenn Sie noch kein JSONArray-Objekt haben, rufen Sie auf

JSONArray jsonArray = new JSONArray(jsonArrayString);

Führen Sie dann 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.

List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
    list.add( jsonArray.getString(i) );
}
Nick
quelle
2
Entschuldigung, Sie haben Recht - ich verwechsle Listen mit JSONArrays :) Es ist in der Tat JSONArray.length ().
Nick
13

Verwenden Sie statt der gebündelten org.jsonBibliothek Jackson oder GSON, bei denen es sich um einen Einzeiler handelt. Mit Jackson, z.

List<String> list = new ObjectMapper().readValue(json, List.class);
// Or for array:
String[] array = mapper.readValue(json, String[].class);
StaxMan
quelle
11

Vielleicht ist es nur eine Problemumgehung (nicht sehr effizient), aber Sie könnten so etwas tun:

String[] resultingArray = yourJSONarray.join(",").split(",");

Natürlich können Sie das ,Trennzeichen nach Belieben ändern (ich hatte eine JSONArrayE-Mail-Adresse).

Guido Sabatini
quelle
8
Beachten Sie, dass Sie absolut sicher sein müssen, dass die Daten kein Trennzeichen enthalten, da Sie sonst beschädigte Daten erhalten.
Artemix
1
und das Ergebnis muss eine Zeichenfolge sein.
Nicolas Tyler
Ein Liner, perfekt.
Zeeshan
4

Verwendung kann ein String[]anstelle eines verwenden ArrayList<String>:

Dadurch wird der Speicheraufwand für eine ArrayList reduziert

Ich hoffe es hilft!

String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
    parametersArray[i] = parametersJSONArray.getString(i);
}
nurnachman
quelle
3

Mit Java Streams können Sie einfach eine IntStreamZuordnung der Objekte verwenden:

JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
        .mapToObj(array::get)
        .map(Object::toString)
        .collect(Collectors.toList());
Samuel Philipp
quelle
0

Ich weiß, dass es sich bei dieser Frage um JSONArray handelt, aber das folgende Beispiel hat sich als nützlich erwiesen, wenn Sie JSONArray nicht zum Extrahieren von Objekten aus JSONObject verwenden müssen.

import org.json.simple.JSONObject;
import org.json.simple.JSONValue;

String jsonStr = "{\"types\":[1, 2]}";
JSONObject json = (JSONObject) JSONValue.parse(jsonStr);
List<Long> list = (List<Long>) json.get("types");
if (list != null) {
    for (Long s : list) {
        System.out.println(s);
    }
}

Funktioniert auch mit einer Reihe von Zeichenfolgen

pchot
quelle
0

Hier ist eine bessere Möglichkeit: Wenn Sie die Daten von der API erhalten. PARSE dann den JSON und lade ihn in deine Listenansicht:

protected void onPostExecute(String result) {
                Log.v(TAG + " result);


                if (!result.equals("")) {

                    // Set up variables for API Call
                    ArrayList<String> list = new ArrayList<String>();

                    try {
                        JSONArray jsonArray = new JSONArray(result);

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

                            list.add(jsonArray.get(i).toString());

                        }//end for
                    } catch (JSONException e) {
                        Log.e(TAG, "onPostExecute > Try > JSONException => " + e);
                        e.printStackTrace();
                    }


                    adapter = new ArrayAdapter<String>(ListViewData.this, android.R.layout.simple_list_item_1, android.R.id.text1, list);
                    listView.setAdapter(adapter);
                    listView.setOnItemClickListener(new OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                            // ListView Clicked item index
                            int itemPosition = position;

                            // ListView Clicked item value
                            String itemValue = (String) listView.getItemAtPosition(position);

                            // Show Alert
                            Toast.makeText( ListViewData.this, "Position :" + itemPosition + "  ListItem : " + itemValue, Toast.LENGTH_LONG).show();
                        }
                    });

                    adapter.notifyDataSetChanged();


                        adapter.notifyDataSetChanged();

...
Joolah
quelle
0

wir beginnen mit der Konvertierung [JSONArray -> List <JSONObject>]

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

Als nächstes erstellen Sie eine generische Version, die array.getJSONObject (i ++) durch POJO ersetzt

Beispiel:

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;
}
ceph3us
quelle
0

Sie können ein String[]anstelle eines verwenden ArrayList<String>:

Ich hoffe es hilft!

   private String[] getStringArray(JSONArray jsonArray) throws JSONException {
            if (jsonArray != null) {
                String[] stringsArray = new String[jsonArray.length()];
                for (int i = 0; i < jsonArray.length(); i++) {
                    stringsArray[i] = jsonArray.getString(i);
                }
                return stringsArray;
            } else
                return null;
        }
Iman Marashi
quelle
0

   private String[] getStringArray(JSONArray jsonArray) throws JSONException {
            if (jsonArray != null) {
                String[] stringsArray = new String[jsonArray.length()];
                for (int i = 0; i < jsonArray.length(); i++) {
                    stringsArray[i] = jsonArray.getString(i);
                }
                return stringsArray;
            } else
                return null;
        }

user10878560
quelle
0

Wir können den JSON einfach in einen lesbaren String konvertieren und ihn mit der "split" -Methode der String-Klasse teilen.

String jsonAsString = yourJsonArray.toString();
//we need to remove the leading and the ending quotes and square brackets
jsonAsString = jsonAsString.substring(2, jsonAsString.length() -2);
//split wherever the String contains ","
String[] jsonAsStringArray = jsonAsString.split("\",\"");
Mayank Yadav
quelle
-2

Ich weiß, dass die Frage für war Java. Aber ich möchte eine mögliche Lösung für teilen, Kotlinweil ich denke, dass es nützlich ist.

Mit Kotlin können Sie eine Erweiterungsfunktion schreiben, die a JSONArrayin ein natives (Kotlin) Array konvertiert :

fun JSONArray.asArray(): Array<Any> {
    return Array(this.length()) { this[it] }
}

Jetzt können Sie asArray()eine JSONArrayInstanz direkt aufrufen .

Johannes Barop
quelle
-3

Wie wäre es mit java.util.Arrays?

List<String> list = Arrays.asList((String[])jsonArray.toArray())
Michal Tsadok
quelle
15
Ich sehe keine toArray()Methode in den JSONArray()Dokumenten. json.org/javadoc/org/json/JSONArray.html Diese Frage wäre wahrscheinlich nicht gestellt worden, wenn es eine einfache gegeben hätte toArray().
Javajavajavajavajava
1
net.sf.json.JSONArray verfügt über die toArray () -Methode, sodass diese Antwort für diese JSON-Bibliothek funktioniert. In der Frage wurde die verwendete Bibliothek nicht angegeben.
Ilinca