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!

TheGeekNess
sumber
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));
   } 
} 
Sagar Maiyad
sumber
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\": \"[email protected]\",\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\": \"[email protected]\",\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\": \"[email protected]\",\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\": \"[email protected]\",\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\": \"[email protected]\",\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\": \"[email protected]\",\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\": \"[email protected]\",\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\": \"[email protected]\",\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\": \"[email protected]\",\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\": \"[email protected]\",\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\": \"[email protected]\",\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\": \"[email protected]\",\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\": \"[email protected]\",\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.

Hiren Patel
sumber
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) );
Sunil Kumar
sumber
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);
brianestey
sumber
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);
Vasilii Suricov
sumber
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())
Anant Simran Singh
sumber
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++)));
Tukang sortir
sumber
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);
R9J
sumber
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;
kunal khedkar
sumber
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.

Mehul Boghra
sumber
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());
Min Hyoung Hong
sumber
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;
}
ceph3us
sumber
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);
Bheem Singh
sumber
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"));
yoAlex5
sumber
0
ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
 listdata.addAll(jArray);
}

@tokopedia

naveen sunkavalli
sumber
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);
Prem Abhisek
sumber
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());
Vivek Dhayaal
sumber