ArrayList <MyCustomClass> öğesini JSONArray'e dönüştür


116

ListView için bir ArrayAdapter içinde kullandığım bir ArrayList var. Bir API'ye göndermek için listedeki öğeleri alıp bir JSONArray'e dönüştürmem gerekiyor. Etrafı araştırdım, ancak bunun nasıl çalıştığını açıklayan hiçbir şey bulamadım, herhangi bir yardım takdir edilecektir.

GÜNCELLEME - ÇÖZÜM

İşte sorunu çözmek için yaptığım şey.

ArrayList'teki nesne:

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

İşte onu nasıl dönüştürdüm:

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

Ve çıktı:

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

Umarım bu bir gün birine yardımcı olur!

Yanıtlar:


115

JSONArray yapıcılarını doğru okursam, bunları herhangi bir Koleksiyondan (diziList, Koleksiyonun bir alt sınıfıdır) aşağıdaki gibi oluşturabilirsiniz:

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

Referanslar:


3
Bu sizin örneğinizde işe yarıyor, ama benimkinde ArrayList Dizelerden değil Nesnelerden oluşuyor - sanırım bunu soruma koymalıydım. Bunun doğru yön olduğunu düşünüyorum, ancak bunun doğru çalışmasını sağlamak için sınıfımda toString'i geçersiz kılmam gerekebilir.
pmko

1
Listenizde her zaman döngü yapabilir ve bunun için jsArray.put () kullanabilirsiniz. Sonunda nesnelerinizin JSONArray'e dönüştürülebilmesi için bir toString metoduna sahip olması gerektiğini düşünüyorum, çünkü tek olarak kaydedilecekler.
Nanne

3
Bu beni yaklaştırdı, ancak olan şey, her nesneden gelen toString () çıktısının JSONArray'e String olarak eklenmiş olmasıydı. Hala bir JSON Dizeler Dizisi ile sonuçlandım, Nesneler değil. Sınıfımda getJSONObject adında bir yöntem oluşturdum, ardından ArrayList üzerinden döngü yaptım ve bunun sonucunu JSONArray'e koydum. Beni doğru yola soktuğun için teşekkürler. Cevabınızı kabul edeceğim ve sonra yaptığım şeyin bir kod örneğini göndereceğim. Umarım bu kötü SO görgü kuralları değildir.
pmko

64

ArrayList'i JsonArray'e dönüştürmek için Gson kitaplığını kullanın.

Gson gson = new GsonBuilder().create();
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();

5
Bu, OP'nin istediği gibi bir org.json.JSONArray değil, com.google.gson.JsonArray.
nima

Gson.toJsonTree kullanılırken aromatik olarak dosyalanmış bir kimlik daha eklenir. nasıl önlenir.
Hitesh Kamani

@HiteshKamani Otomatik olarak fazladan bir kimlik eklemeyecektir, sınıfınızda bir kimlik alanı olabilir.
Purushotham

Aslında göreve bağlıdır. Genel olarak, android SDK'nın kendine uygun şeyleri yapmak için tüm harici kitaplığı dahil etmeye değmez. Özellikle projede 64K yöntemlerin sınırındaysanız.
Maxim Berezovsky

1
merhaba uttam harika çözüm sadece hızlı bir şey, dizi listesi içindeki dizi
listesini

35

Birisi, OP'nin özel Listeyi org.json.JSONArraydeğil de dönüştürmek istediğini anladığındacom.google.gson.JsonArray , DOĞRU cevap şu şekilde olmalıdır:

Gson gson = new Gson();

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

 JSONArray jsonArray =  new JSONArray(listString);

Harika :) Mükemmelsin
Pratik Butani

@zionpi Burada bir dizi listesini Json dizisine dönüştürmek için 2 kitaplık kullanılıyor
Purushotham

@Uttam Bunda kullanılan iki lib'i nerede görebilirsiniz?
Ravi Yadav

Doğruysam, JSONArray org.json'dan ve Gson com.google.json'dan
Purushotham

Gah, bu kontrol edilen istisnayı atar: JSONException. Aksi takdirde mükemmel cevap tam burada.
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
Tembel bir programcı olmamın nedenlerinden biri budur. SOF'tan bir şeyler yapmak için kapsül büyüklüğünde kod alıyorum. Kopyala yapıştır ve her şey çalışıyor. Ne zaman tamamen aynı şeyi yapan bir robotla değiştirileceğimi merak ediyorum ...
Subin Sebastian

1

Zaten yanıtlandığını biliyorum, ancak burada daha iyi bir çözüm var bu kodu kullanın:

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

Bu şekilde, sınıftan değişkenlere manuel olarak yazmadan erişebilirsiniz.

Daha hızlı ve daha iyi .. Umarım bu yardımcı olur.

Şerefe. : D


1

Notunuza ekleyin:

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

dönüştürme ArrayListiçinJsonArray

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

0

Kotlin ve Gson ile bunu daha kolay yapabiliriz:

  1. İlk önce Gson bağımlılığını ekleyin:

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

  1. Ayrı bir kotlindosya oluşturun , aşağıdaki yöntemleri ekleyin
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)

Not: declare sınıfı eklemeyin, sadece bu yöntemleri ekleyin, her şey yoluna girecektir.

  1. Şimdi aramak için:

bir gson referansı oluşturun:

val gson = Gson ()

Diziyi json dizesine dönüştürmek için şunu çağırın :

val jsonString=gson.convertToJsonString(arrayList)

Json dizesinden dizi almak için şunu arayın :

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

Bir modeli json dizesine dönüştürmek için şunu arayın:

val jsonString=gson.convertToJsonString(model)

Json dizesini modele dönüştürmek için şunu arayın:

val model=gson.convertToModel(jsonString, YourModelClassName::class.java)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.