ubah ArrayList <MyCustomClass> menjadi JSONArray

115

Saya memiliki ArrayList yang saya gunakan dalam ArrayAdapter untuk ListView. Saya perlu mengambil item dalam daftar dan mengubahnya menjadi JSONArray untuk dikirim ke API. Saya telah mencari-cari, tetapi belum menemukan apa pun yang menjelaskan bagaimana ini dapat bekerja, bantuan apa pun akan dihargai.

UPDATE - SOLUSI

Inilah yang akhirnya saya lakukan untuk menyelesaikan masalah.

Objek di ArrayList:

public class ListItem {
    private long _masterId;
    private String _name;
    private long _category;

    public ListItem(long masterId, String name, long category) {
        _masterId = masterId;
        _name = name;
        _category = category;
    }

    public JSONObject getJSONObject() {
        JSONObject obj = new JSONObject();
        try {
            obj.put("Id", _masterId);
            obj.put("Name", _name);
            obj.put("Category", _category);
        } catch (JSONException e) {
            trace("DefaultListItem.toString JSONException: "+e.getMessage());
        }
        return obj;
    }
}

Inilah cara saya mengubahnya:

ArrayList<ListItem> myCustomList = .... // list filled with objects
JSONArray jsonArray = new JSONArray();
for (int i=0; i < myCustomList.size(); i++) {
        jsonArray.put(myCustomList.get(i).getJSONObject());
}

Dan hasilnya:

[{"Name":"Name 1","Id":0,"Category":"category 1"},{"Name":"Name 2","Id":1,"Category":"category 2"},{"Name":"Name 3","Id":2,"Category":"category 3"}]

Semoga ini bisa membantu seseorang suatu hari nanti!

pmko
sumber

Jawaban:

115

Jika saya membaca konstruktor JSONArray dengan benar, Anda dapat membuatnya dari Collection apa pun (arrayList adalah subclass Collection) seperti:

ArrayList<String> list = new ArrayList<String>();
list.add("foo");
list.add("baar");
JSONArray jsArray = new JSONArray(list);

Referensi:

Nanne
sumber
3
Itu berfungsi dalam contoh Anda, tetapi di milik saya ArrayList terdiri dari Objects dan bukan Strings - kira saya harus memasukkannya ke dalam pertanyaan saya. Saya pikir ini adalah arah yang benar, tetapi saya mungkin perlu mengganti toString di kelas saya agar ini berfungsi dengan benar.
pmko
1
Anda selalu dapat mengulang daftar Anda dan menggunakan jsArray.put () untuk ini. Pada akhirnya, objek Anda harus memiliki metode toString agar objek tersebut dapat dikonversi ke JSONArray menurut saya, karena objek tersebut akan disimpan sebagai satu.
Nanne
3
Itu membuat saya hampir, tetapi yang terjadi adalah bahwa output toString () dari setiap objek dimasukkan ke dalam JSONArray sebagai String. Saya masih berakhir dengan JSONArray of Strings dan bukan Objects. Saya akhirnya membuat metode di kelas saya yang disebut getJSONObject, kemudian mengulang ArrayList dan memasukkan hasilnya ke dalam JSONArray. Terima kasih telah menempatkan saya di jalan yang benar. Saya akan menerima jawaban Anda dan kemudian memposting contoh kode dari apa yang akhirnya saya lakukan. Saya harap ini bukan etiket SO yang buruk.
pmko
64

Gunakan perpustakaan Gson untuk mengonversi ArrayList ke JsonArray.

Gson gson = new GsonBuilder().create();
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();
Purushotham
sumber
5
Ini bukan org.json.JSONArray seperti yang diinginkan OP, ini adalah com.google.gson.JsonArray.
nima
satu lagi Id diajukan secara aromatik ditambahkan saat menggunakan Gson.toJsonTree. bagaimana mencegahnya.
Hitesh Kamani
@HiteshKamani Ini tidak akan menambahkan id tambahan secara otomatis, mungkin kelas Anda memiliki field id.
Purushotham
Itu sebenarnya tergantung pada tugas. Umumnya tidak ada gunanya menyertakan seluruh pustaka eksternal untuk melakukan hal-hal yang sesuai dengan SDK Android. Terutama jika Anda berada di tepi metode 64K dalam proyek.
Maxim Berezovsky
1
hai uttam solusi yang luar biasa hanya hal yang cepat itu tidak mengonversi daftar larik dalam daftar larik ke json array
Aashish Bhatnagar
35

Ketika seseorang mengetahui bahwa OP ingin mengubah Daftar kustom menjadi org.json.JSONArraybukan com.google.gson.JsonArray, jawaban BENAR harus seperti ini:

Gson gson = new Gson();

String listString = gson.toJson(
                    targetList,
           new TypeToken<ArrayList<targetListItem>>() {}.getType());

 JSONArray jsonArray =  new JSONArray(listString);
zionpi
sumber
Luar biasa :) Anda sempurna
Pratik Butani
@zionpi Di sini 2 perpustakaan digunakan untuk mengubah daftar array ke array Json
Purushotham
@Uttam Di mana Anda dapat melihat dua lib yang digunakan dalam hal ini?
Ravi Yadav
Jika saya benar, JSONArray dari org.json dan Gson dari com.google.json
Purushotham
Gah ini melempar pengecualian yang diperiksa: JSONException. Kalau tidak, jawaban sempurna di sini.
Babken Vardanyan
5
public void itemListToJsonConvert(ArrayList<HashMap<String, String>> list) {

        JSONObject jResult = new JSONObject();// main object
        JSONArray jArray = new JSONArray();// /ItemDetail jsonArray

        for (int i = 0; i < list.size(); i++) {
            JSONObject jGroup = new JSONObject();// /sub Object

            try {
                jGroup.put("ItemMasterID", list.get(i).get("ItemMasterID"));
                jGroup.put("ID", list.get(i).get("id"));
                jGroup.put("Name", list.get(i).get("name"));
                jGroup.put("Category", list.get(i).get("category"));

                jArray.put(jGroup);

                // /itemDetail Name is JsonArray Name
                jResult.put("itemDetail", jArray);
                return jResult;
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

    }
dhamat chetan
sumber
2
Inilah salah satu alasan mengapa saya menjadi programmer yang malas. Saya mendapatkan kode ukuran kapsul untuk melakukan sesuatu dari SOF. Salin tempel, dan semuanya berfungsi. Bertanya-tanya kapan saya akan digantikan oleh robot yang melakukan hal yang persis sama ...
Subin Sebastian
1

Saya tahu ini sudah dijawab, tetapi ada solusi yang lebih baik di sini gunakan kode ini:

for ( Field f : context.getFields() ) {
     if ( f.getType() == String.class ) || ( f.getType() == String.class ) ) {
           //DO String To JSON
     }
     /// And so on...
}

Dengan cara ini Anda dapat mengakses variabel dari kelas tanpa mengetiknya secara manual ..

Lebih cepat dan lebih baik .. Semoga ini bisa membantu.

Bersulang. : D

ralphgabb.dll
sumber
1

Tambahkan ke gradle Anda:

implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

Ubah ArrayListkeJsonArray

JsonArray jsonElements = (JsonArray) new Gson().toJsonTree(itemsArrayList);
Deep Patel
sumber
0

Dengan kotlin dan Gson kita bisa melakukannya dengan lebih mudah:

  1. Pertama, tambahkan dependensi Gson:

implementation "com.squareup.retrofit2:converter-gson:2.3.0"

  1. Buat kotlinfile terpisah , tambahkan metode berikut
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken

fun <T> Gson.convertToJsonString(t: T): String {
    return toJson(t).toString()
}

fun <T> Gson.convertToModel(jsonString: String, cls: Class<T>): T? {
    return try {
        fromJson(jsonString, cls)
    } catch (e: Exception) {
        null
    }
}

inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)

Catatan: Jangan tambahkan kelas deklarasi, cukup tambahkan metode ini, semuanya akan berfungsi dengan baik.

  1. Sekarang untuk menelepon:

buat referensi gson:

val gson = Gson ()

Untuk mengubah array menjadi string json, panggil :

val jsonString=gson.convertToJsonString(arrayList)

Untuk mendapatkan array dari string json, panggil :

val arrayList=gson.fromJson<ArrayList<YourModelClassName>>(jsonString)

Untuk mengonversi model ke string json, panggil:

val jsonString=gson.convertToJsonString(model)

Untuk mengonversi string json menjadi model, panggil:

val model=gson.convertToModel(jsonString, YourModelClassName::class.java)
Suraj Vaishnav
sumber