Konversi Json Array ke daftar Java normal


130

Apakah ada cara untuk mengkonversi JSON Array ke Java Array normal untuk pengikatan data ListView android?


8
Yang lucu adalah bahwa org.JSONArraymenggunakan ArrayList di bawah tenda ... The arrayList where the JSONArray's properties are kept, sehingga sebagian besar perulangan dilakukan tanpa alasan dalam banyak kasus (hanya untuk enkapsulasi)
Christophe Roussy

Jawaban:


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
untuk loop tidak ada tanda kurung tutup ... mencoba mengedit tetapi tidak cukup karakter untuk melewati persetujuan. Baiklah! hanya FYI.
Matt K

itz tidak hilang sebenarnya, penjawab hanya menyisipkan sepotong kode dengan kurung buka dan tutup fungsi.
Sarim Javaid Khan

1
Apa yang terjadi jika jsonArray.get(i)pengembalian nol (sebagai akibat dari penguraian ini:) [ "String 1", null, "String 2" ]? Bukankah for-loop Anda rusak?
dbm

Terima kasih. Jika seseorang memiliki sring maka JSONArray dapat dibuat sebagai JSONArray jsonArray = JSONArray baru (yourString); sisa kode akan tetap sama.
Kaushik Lele

Tergantung pada pelaksanaan Anda mungkin perlu size()bukan length().
Guillaume F.

57

Jika Anda belum memiliki objek JSONArray, hubungi

JSONArray jsonArray = new JSONArray(jsonArrayString);

Maka cukup loop melalui itu, membangun array Anda sendiri. Kode ini menganggap itu adalah array dari string, seharusnya tidak sulit untuk dimodifikasi agar sesuai dengan struktur array khusus Anda.

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

2
Maaf, Anda benar - Saya Daftar yang membingungkan dengan JSONArrays :) Ini memang JSONArray.length ().
Nick

13

Alih-alih menggunakan bundled-in org.jsonlibrary, coba gunakan Jackson atau GSON, di mana ini adalah satu-liner. Dengan Jackson, f.ex:

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

11

Mungkin ini hanya solusi (tidak sangat efisien) tetapi Anda dapat melakukan sesuatu seperti ini:

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

Jelas Anda dapat mengubah ,pemisah ' ' dengan apa pun yang Anda suka (saya punya JSONArrayalamat email)


8
Perhatikan bahwa Anda harus benar-benar yakin bahwa data tidak mengandung karakter pemisah Anda, jika tidak Anda akan berakhir dengan data yang rusak.
Artemix

1
dan hasilnya harus berupa string.
Nicolas Tyler

Satu liner, sempurna.
zeeshan

4

Gunakan dapat menggunakan String[]bukan ArrayList<String>:

Ini akan mengurangi overhead memori yang dimiliki ArrayList

Semoga ini bisa membantu!

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

3

Menggunakan Java Streaming Anda cukup menggunakan IntStreampemetaan objek:

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

0

Saya tahu pertanyaan itu adalah tentang JSONArray tapi inilah contoh yang saya temukan berguna di mana Anda tidak perlu menggunakan JSONArray untuk mengekstrak objek dari JSONObject.

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

Bekerja juga dengan berbagai string


0

Berikut ini cara yang lebih baik untuk melakukannya: jika Anda mendapatkan data dari API. Kemudian PARSE the JSON dan memuatnya ke listview Anda:

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

kita mulai dari konversi [JSONArray -> Daftar <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;
}

selanjutnya buat versi generik menggantikan array.getJSONObject (i ++) dengan POJO

contoh:

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

Anda dapat menggunakan String[]alih - alih ArrayList<String>:

Semoga ini bisa membantu!

   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

Kita cukup mengonversi JSON menjadi string yang dapat dibaca, dan membaginya menggunakan metode "split" dari kelas String.

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

Saya tahu bahwa pertanyaan itu untuk Java. Tetapi saya ingin membagikan solusi yang mungkin Kotlinkarena saya pikir ini berguna.

Dengan Kotlin Anda dapat menulis fungsi ekstensi yang mengubah JSONArrayarray menjadi asli (Kotlin):

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

Sekarang Anda dapat menelepon asArray()langsung melalui JSONArrayinstance.


-3

Bagaimana dengan menggunakan java.util.Arrays?

List<String> list = Arrays.asList((String[])jsonArray.toArray())

15
Saya tidak melihat toArray()metode dalam JSONArray()dokumen. json.org/javadoc/org/json/JSONArray.html Pertanyaan ini mungkin tidak akan ditanyakan jika ada yang sederhana toArray().
javajavajavajavajava

1
net.sf.json.JSONArray memiliki metode toArray () sehingga respons ini berfungsi untuk pustaka JSON ini. Pertanyaannya tidak menentukan perpustakaan yang digunakan.
ilinca
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.