Mengonversi JSONarray ke ArrayList


104

Saya mengunduh string JSON dan mengonversinya menjadi JSONArray. Saya memasukkannya ke listview dan harus dapat menghapus dari listview itu nanti, dan karena JSONArray tidak memiliki metode .remove (Terima kasih Obama), saya mencoba mengubahnya menjadi arraylist.

ini JSON saya (the 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"}]

Saya perlu memasukkannya ke dalam array dan dapat memanggil string dengan kunci masing-masing. Hargai bantuan apapun!


Saat Anda mengucapkan kunci, bukankah itu menyiratkan semacam Kamus (Peta di Android)? Sebuah array akan berbasis indeks. Lihat developer.android.com/reference/java/util/Map.html untuk mengetahui cara membuat dan menggunakan.
Brianestey

Dapatkah peta digunakan untuk mengisi tampilan daftar dengan adaptor dasar khusus? Saya lebih suka tidak menggunakan indeks jika JSON pernah mengubah urutan.
TheGeekNess

ListView akan mendapatkan objek dari adaptor dengan indeks, jadi bagaimanapun juga Anda perlu menjaga daftar dalam beberapa urutan. Jika Anda ingin mempertahankan urutan kunci (dan mengetahui apa kunci tersebut pada waktu kompilasi), Anda dapat melakukan hard-code pada array kunci tersebut dalam urutan yang Anda suka dan menggunakannya untuk pengurutan saat mengambil dari Peta.
Brianestey

Jawaban:


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

3
Dan listdata.add(jArray.optJSONObject(i));jika listdata Anda adalah arrayList JSONObject. ArrayList<JSONObject> listdata = new ArrayList<JSONObject>();
Subin Sebastian

2
Potongan yang bagus. Untuk berjaga-jaga jika ada yang mau: ada kelas helper yang mengubah JSONObject / JSONArray menjadi Peta / Daftar standar di github gist.github.com/codebutler/2339666
inexcii

2
Mengapa tidak menggunakan ArrayList<Object>?
natanavra

Bagaimana saya menangani Array Json kosong. tolong balas saya bro.
MohanRaj S

3
Apakah ada cara lain untuk melakukan ini tanpa loop?
K. Sopheak

65

Saya telah melakukannya dengan menggunakan Gson(oleh Google) .

Tambahkan baris berikut ke modul Anda 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 tali:

private String jsonString = "[\n" +
            "        {\n" +
            "                \"id\": \"c200\",\n" +
            "                \"name\": \"Ravi Tamada\",\n" +
            "                \"email\": \"ravi@gmail.com\",\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\": \"johnny_depp@gmail.com\",\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\": \"leonardo_dicaprio@gmail.com\",\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\": \"john_wayne@gmail.com\",\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\": \"angelina_jolie@gmail.com\",\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\": \"dido@gmail.com\",\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\": \"adele@gmail.com\",\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\": \"hugh_jackman@gmail.com\",\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\": \"will_smith@gmail.com\",\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\": \"clint_eastwood@gmail.com\",\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\": \"barack_obama@gmail.com\",\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\": \"kate_winslet@gmail.com\",\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\": \"eminem@gmail.com\",\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;
}

Kode untuk mengonversi string JSON menjadi ArrayList<Model>:

Catatan: Anda harus mengimpor 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);
    }
}

Semoga ini bisa membantu Anda.


4
TIGA BARIS ... SELESAI! Saya pikir ini seharusnya merupakan jawaban yang diterima karena (a) hanya tiga baris kode yang bekerja dengan baik, dan (b) beberapa jawaban benar-benar melakukan terjemahan yang diketik dari JSONArray ke List <CustomObject>. Terima kasih!
John Ward

Ini harus berupa JSONArray, JSONElement sepertinya tidak berfungsi. jadi, gunakan getAsJsonArray()metode tersebut secara nyata. Terima kasih!
嘉 恒 陶

1
Persis yang saya butuhkan, terima kasih! Catatan: Anda harus mengimpor ini: java.lang.reflect.Type; com.google.gson.reflect.TypeToken;
Chandrani H

Luar biasa, Ini seharusnya jawaban yang diterima !. Terima kasih
Yeuni

ini tidak berfungsi dengan mengatakan init dari jenis token dilindungi
nikoss

7

coba cara ini Cukup putar melalui itu, buat array Anda sendiri. Kode ini mengasumsikan itu adalah larik string, seharusnya tidak sulit untuk dimodifikasi agar sesuai dengan struktur larik khusus Anda.

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

6

Alih-alih mengonversi string JSON menjadi ArrayList atau bahkan Map, Anda bisa membuat JSONObject itu sendiri. Objek ini memiliki kemampuan untuk mendapatkan nilai string dengan kunci , seperti yang Anda inginkan dan juga untuk menghapus objek .

Untuk membuat JSONObjectdari string JSON yang diformat dengan benar, Anda cukup memanggil konstruktor yang sesuai .

JSONObject json = new JSONObject(jsonString);

1
Masalah yang saya hadapi dengan solusi ini secara khusus, adalah bahwa ketika berhadapan dengan JSONObject dan JSONArray, mereka membuang JSONException. Terkadang berguna untuk meneruskan konten JSONArray ke fungsi yang seharusnya tidak memperhatikan JSON.
Aaron Dougherty

2
Saya setuju. Saya akan menggunakan JSONObject sebagai bagian dari parsing teks JSON menjadi objek model yang dapat digunakan. Setiap JSONException yang dimunculkan akan menunjukkan masalah dengan JSON sumber, yang berarti Anda tidak dapat menguraikannya menjadi JSONArray atau JSONObject, apalagi objek model yang berbeda.
Brianestey

6

Saya punya solusi cepat. Buat saja fileArrayUtil.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);
    }

}

Pemakaian:

ArrayList<Object> list = ArrayUtil.convert(jArray);

atau

JSONArray jArr = ArrayUtil.convert(list);

Apa yang saya lakukan jika perlu mengembalikanArrayList<String>

Saya pikir tidak mungkin mentransmisikan ArrayList <Object> ke ArrayList <String>
Vasilii Suricov

1
Kudos untuk jawaban ini. Kamu menyelesaikan hariku! Saya menghabiskan 2 jam mencoba memperbaiki ini. Sebenarnya masalah saya adalah saya ingin menempatkan dikonversi JSONArrayke daftar sehingga saya bisa menempatkan Listdalam HashMap, sehingga util ini bekerja untuk saya cukup baik. Terima kasih @Vasilii Suricov
Jose Mhlanga

5

Di Jawa 8,

IntStream.range(0,jsonArray.length()).mapToObj(i->jsonArray.getString(i)).collect(Collectors.toList())

1
Satu-satunya masalah dengan ini adalah bahwa JSONArray.getString (...) melontarkan pengecualian yang harus ditangani di dalam pemetaan, jadi Anda akan berakhir dengan 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());yang tidak elegan lagi. Jadi saya akan pergi dengan foreach :)
LazR

Ini adalah jawaban terbaik di sini (imho) tetapi akan elegan jika ada cara agar tidak perlu mengakses referensi jsonArray lebih dari sekali.
djangofan

4
 JSONArray array = new JSONArray(json);
 List<JSONObject> list = new ArrayList();
 for (int i = 0; i < array.length();list.add(array.getJSONObject(i++)));

2

Untuk membuatnya praktis, gunakan POJO.

coba seperti ini ..

List<YourPojoObject> yourPojos = new ArrayList<YourPojoObject>();

JSONObject jsonObject = new JSONObject(jsonString);
YourPojoObject yourPojo = new YourPojoObject();
yourPojo.setId(jsonObject.getString("idName"));
...
...

yourPojos.add(yourPojo);

1

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

1

Jika Anda ingin mengekstrak data dari string array JSON, berikut adalah kode kerja saya. ubah parameter sebagai data Anda.


Kelas PoJo

public class AllAppModel {
    private String appName;
    private String packageName;
    private int uid;
    private boolean isSelected;
    private boolean isSystemApp;
    private boolean isFav;
}

Ekstrak data Anda menggunakan baris kode di bawah ini

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

itu akan mengembalikan Anda Daftar objek kelas PoJo.


1

Gaya Java 8

   JSONArray data = jsonObject.getJSONArray("some-node");

   List<JSONObject> list = StreamSupport.stream(data.spliterator(), false)
                .map(e -> (JSONObject)e)
                .collect(Collectors.toList());

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

0

Saya punya solusi cepat. Buat saja fileArrayUtil.java

ObjectMapper mapper = new ObjectMapper(); 
List<Student> list = Arrays.asList(mapper.readValue(jsonString, Student[].class));

Pemakaian:

ArrayList<Object> list = ArrayUtil.convert(jArray);

atau

JSONArray jArr = ArrayUtil.convert(list);

0

Varian umum

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

0
ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
 listdata.addAll(jArray);
}

@tokopedia


0

Hanya mengikuti subjek asli utas:

mengonversi jsonarray ke list (gunakan jackson jsonarray dan object mapper di sini):

ObjectMapper mapper = new ObjectMapper();
JSONArray array = new JSONArray();
array.put("IND");
array.put("CHN");
List<String> list = mapper.readValue(array.toString(), List.class);

0

Alternatif Java 8 yang lebih sederhana:

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