преобразовать ArrayList <MyCustomClass> в JSONArray

116

У меня есть 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"}]

Надеюсь, это когда-нибудь поможет кому-то!

pmko
источник

Ответы:

115

Если я правильно прочитал конструкторы JSONArray, вы можете построить их из любой коллекции (arrayList является подклассом Collection) следующим образом:

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

Ссылки:

Nanne
источник
3
Это работает в вашем примере, но в моем ArrayList состоит из объектов, а не строк - думаю, я должен был указать это в своем вопросе. Я думаю, что это правильное направление, но мне может потребоваться переопределить toString в моем классе, чтобы это работало правильно.
pmko
1
Вы всегда можете перебрать свой список и использовать для этого jsArray.put (). В конце концов, у ваших объектов должен быть метод toString для их преобразования в JSONArray в любом случае, я думаю, потому что они будут сохранены как один.
Nanne
3
Это меня сблизило, но произошло то, что вывод toString () каждого объекта был вставлен в JSONArray как String. У меня все еще остался JSONArray строк, а не объектов. В итоге я создал в своем классе метод под названием getJSONObject, затем перебрал в цикле ArrayList и поместил результат этого в JSONArray. Спасибо, что направили меня на правильный путь. Я собираюсь принять ваш ответ, а затем опубликую образец кода того, чем я закончил. Надеюсь, это неплохой ТАК этикет.
pmko
64

Используйте библиотеку Gson для преобразования ArrayList в JsonArray.

Gson gson = new GsonBuilder().create();
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();
Purushotham
источник
5
Это не org.json.JSONArray, как хотел OP, это com.google.gson.JsonArray.
Нима
при использовании Gson.toJsonTree автоматически добавляется еще одно поле идентификатора. как это предотвратить.
Hitesh Kamani
@HiteshKamani Он не добавит дополнительный идентификатор автоматически, возможно, у вашего класса есть поле идентификатора.
Purushotham
На самом деле это зависит от задачи. Как правило, не стоит включать всю внешнюю библиотеку, чтобы делать то, что Android SDK может удовлетворить сам по себе. Особенно, если вы используете 64K методов в проекте.
Максим Березовский
1
привет уттам классное решение, просто быстрое решение, оно не преобразует массив из массива в массив в массив json
Аашиш Бхатнагар,
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
источник
Потрясающе :) Ты идеален
Pratik Butani
@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

ralphgabb
источник
1

Добавьте в свой класс:

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

Преобразовать ArrayListвJsonArray

JsonArray jsonElements = (JsonArray) new Gson().toJsonTree(itemsArrayList);
Deep Patel
источник
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)
Сурадж Вайшнав
источник