Konversi Json Array ke daftar Java normal

130

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

Houston kita punya masalah
sumber
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());
   } 
} 
Pentium10
sumber
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) );
}
Nick
sumber
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);
StaxMan
sumber
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)

Guido Sabatini
sumber
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);
}
nurnachman
sumber
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());
Samuel Philipp
sumber
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

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

...
Joolah
sumber
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;
}
ceph3us
sumber
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;
        }
Iman Marashi
sumber
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;
        }

pengguna10878560
sumber
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("\",\"");
Mayank Yadav
sumber
-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.

Johannes Barop
sumber
-3

Bagaimana dengan menggunakan java.util.Arrays?

List<String> list = Arrays.asList((String[])jsonArray.toArray())
Michal Tsadok
sumber
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