конвертувати ArrayList <MyCustomClass> в JSONArray


115

У мене є ArrayList, який я використовую в ArrayAdapter для ListView. Мені потрібно взяти елементи зі списку та перетворити їх у JSONArray для надсилання в API. Я шукав, але не знайшов нічого, що пояснює, як це може працювати, будь-яка допомога буде вдячна.

ОНОВЛЕННЯ - РІШЕННЯ

Ось що я закінчив робити для вирішення проблеми.

Об'єкт в 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;
    }
}

Ось як я його перетворив:

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

І вихід:

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

Сподіваюся, це допоможе комусь одного дня!

Відповіді:


115

Якщо я прочитав правильно конструктори JSONArray, ви можете створити їх з будь-якої колекції (arrayList - це підклас колекції) так:

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

Список літератури:


3
Це працює у вашому прикладі, але в моєму ArrayList складається з об'єктів, а не рядків - здогадуюсь, я мав би це поставити у своєму питанні. Я думаю, що це правильний напрямок, але мені може знадобитися переосмислити ToString в моєму класі, щоб змусити це правильно працювати.
pmko

1
Ви завжди можете перевести цикл на свій список і використовувати для цього jsArray.put (). Зрештою, у ваших об'єктів повинен бути метод toString для їх перетворення в JSONArray так чи інакше, я думаю, тому що вони будуть збережені як один.
Нанна

3
Це мене зблизило, але сталося те, що висновок toString () від кожного об'єкта вставлявся в JSONArray як String. Я все-таки закінчився JSONArray of Strings, а не Objects. Я в кінцевому підсумку створив метод у своєму класі під назвою getJSONObject, потім перекинувся на ArrayList і помістив результат цього в JSONArray. Дякуємо, що поставили мене на правильний шлях. Я збираюся прийняти вашу відповідь, а потім опублікую зразок коду того, що я в кінцевому підсумку робив. Я сподіваюся, що це непогано етикет.
pmko

64

Використовуйте бібліотеку Gson для перетворення ArrayList в JsonArray.

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

5
Це не org.json.JSONArray, як хотів ОП, це com.google.gson.JsonArray.
німа

ще один Ідентифікований файл ароматично додається під час використання Gson.toJsonTree. як запобігти.
Хітеш Камані

@HiteshKamani Він не додасть додатковий ідентифікатор автоматично, можливо, у вашому класі є поле ідентифікатора.
Пурушотам

Це фактично залежить від завдання. Взагалі не варто включати всю зовнішню бібліотеку, щоб робити речі, андроїд SDK може влаштовувати себе. Особливо, якщо ви знаходитесь на межі 64K методів у проекті.
Максим Березовський

1
привіт, ультра-дивовижне рішення просто швидка річ, що не перетворює arraylist з масиву на масив json
Aashish Bhatnagar

35

Як хтось з'ясує, що ОП хоче перетворити користувацький список org.json.JSONArrayне в той com.google.gson.JsonArray, ПРАВИЛЬНА відповідь повинна бути такою:

Gson gson = new Gson();

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

 JSONArray jsonArray =  new JSONArray(listString);

Дивовижно :) Ви ідеальні
Пратік Бутані

@zionpi Тут 2 бібліотеки використовуються для перетворення списку масиву в Json масив
Purushotham

@Uttam Де ви можете бачити два в'язки, які використовуються в цьому?
Раві Ядав

Якщо я маю рацію, JSONArray - від org.json, а Gson - від com.google.json
Purushotham

Gah це кидає перевірений виняток: JSONException. Інакше ідеальна відповідь саме тут.
Бабкен Варданян

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
Це одна з причин, чому я став ледачим програмістом. Я отримую код розміру капсули для виконання речей від SOF. Скопіюйте пасту, і все працює. Цікаво, коли мене замінить робот, який робить точно так само ...
Субін Себастьян

1

Я знаю, що його вже відповіли, але тут краще рішення використовувати цей код:

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

Таким чином ви можете отримати доступ до змінних з класу, не вводячи їх вручну ..

Швидше і краще .. Сподіваюся, що це допомагає.

Ура. : D


1

Додайте до своєї граді:

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

Перетворити ArrayListвJsonArray

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

0

З kotlin та Gson ми можемо це зробити легше:

  1. Спочатку додайте залежність Gson:

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

  1. Створіть окремий kotlinфайл, додайте наступні методи
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)

Примітка: не додайте клас оголошень, просто додайте ці методи, все буде добре.

  1. Тепер зателефонувати:

створити посилання на gson:

val gson = Gson ()

Щоб перетворити масив у json рядок, зателефонуйте :

val jsonString=gson.convertToJsonString(arrayList)

Щоб отримати масив із рядка json, зателефонуйте :

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

Щоб перетворити модель в рядок json, зателефонуйте:

val jsonString=gson.convertToJsonString(model)

Щоб перетворити рядок json в модель, зателефонуйте:

val model=gson.convertToModel(jsonString, YourModelClassName::class.java)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.