Json Array'i normal Java listesine dönüştür


130

Android ListView veri bağlama için JSON Dizisini normal Java Dizisine dönüştürmenin bir yolu var mı?


8
İşin komik yani org.JSONArraykaputun altında bir ArrayList ... kullanır The arrayList where the JSONArray's properties are kept, böylece en (sadece encapsulation'ı) birçok durumda hiçbir şey için yapılır loop
Christophe Roussy

Yanıtlar:


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

5
for döngüsü kapanış parantezi eksik ... düzenlemeyi denedi, ancak onayı geçmek için yeterli karakter yok. Oh iyi! sadece bir FYI.
Matt K

aslında eksik değil, yanıtlayan az önce işlevin açık ve kapalı parantezleriyle bir kod parçası yapıştırdı.
Sarim Javaid Khan

1
jsonArray.get(i)Null döndürürse ne olur (bunu ayrıştırmanın bir sonucu olarak :) [ "String 1", null, "String 2" ]? O zaman for-loop çökmez mi?
dbm

Teşekkürler. Birinde sring varsa, JSONArray JSONArray jsonArray = new JSONArray (yourString) olarak oluşturulabilir; kodun geri kalanı aynı kalacaktır.
Kaushik Lele

size()Bunun yerine uygulamaya bağlı olarak ihtiyacınız olabilir length().
Guillaume F.

57

Zaten bir JSONArray nesneniz yoksa,

JSONArray jsonArray = new JSONArray(jsonArrayString);

Ardından, kendi dizinizi oluşturarak bunun üzerinden dönün. Bu kod, onun bir dizi dizisi olduğunu varsayar, belirli dizi yapınıza uyacak şekilde değiştirmek zor olmamalıdır.

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

2
Üzgünüm, haklısınız - Listeleri JSONArrays ile karıştırıyorum :) Bu gerçekten JSONArray.length ().
Nick

13

org.jsonBirlikte verilen kitaplığı kullanmak yerine, tek satırlık olduğu Jackson veya GSON kullanmayı deneyin. Jackson, f.ex ile:

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

11

Belki bu yalnızca bir geçici çözümdür (çok verimli değildir), ancak şöyle bir şey yapabilirsiniz:

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

Açıkçası ' ,' ayırıcısını istediğiniz herhangi bir şeyle değiştirebilirsiniz JSONArray(e-posta adresim vardı )


8
Verilerin ayırıcı karakterinizi içermediğinden kesinlikle emin olmanız gerektiğini unutmayın, aksi takdirde bozuk verilerle sonuçlanırsınız.
Artemix

1
ve sonuç bir dizge olmalıdır.
Nicolas Tyler

Tek astar, mükemmel.
zeeshan

4

Şunu kullanmak, bir String[]yerine a kullanabilir ArrayList<String>:

Bir ArrayList'in sahip olduğu bellek ek yükünü azaltacaktır.

Umarım yardımcı olur!

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

3

Java Akışlarını kullanarak, yalnızca IntStreamnesnelerin eşlemesini kullanabilirsiniz :

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

0

Bu sorunun JSONArray ile ilgili olduğunu biliyorum, ancak burada örnek JSONObject'ten nesneleri ayıklamak için JSONArray kullanmanız gerekmediğinde faydalı buldum.

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

Dizge dizisi ile de çalışır


0

İşte bunu yapmanın daha iyi bir yolu: verileri API'den alıyorsanız. Ardından JSON'u PARSE ve liste görünümünüze yükleyin:

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

...

0

dönüşümden başlıyoruz [JSONArray -> Liste <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;
}

daha sonra, array.getJSONObject (i ++) 'yi POJO ile değiştirerek genel sürüm oluşturun

misal :

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

0

Bir String[]yerine a kullanabilirsiniz ArrayList<String>:

Umarım yardımcı olur!

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

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


0

JSON'u okunabilir dizgeye dönüştürebilir ve String sınıfının "split" yöntemini kullanarak bölebiliriz.

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("\",\"");

-2

Sorunun bunun için olduğunu biliyorum Java. Ancak olası bir çözümü paylaşmak istiyorum Kotlinçünkü bunun faydalı olduğunu düşünüyorum.

Kotlin ile JSONArray, bir yerel (Kotlin) dizisine dönüştüren bir uzantı işlevi yazabilirsiniz :

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

Artık asArray()doğrudan bir JSONArrayörneğe çağrı yapabilirsiniz .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.