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!

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:


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

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

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

    }

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


1

Tambahkan ke gradle Anda:

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

Ubah ArrayListkeJsonArray

JsonArray jsonElements = (JsonArray) new Gson().toJsonTree(itemsArrayList);

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