Почему в Android JSONArray нет метода удаления (int position)?

Я начал создавать приложение для Android, которое использует плоский файл для хранения. Приложение не хранит более шести записей, и я знаком с JSON, поэтому я просто пишу JSONArray в файл.

Я только что обнаружил сегодня, что API Android JSON не включает параметр remove(). А? Должен ли я сбрасывать массив в другую коллекцию, удалять ее, а затем восстанавливать JSONArray? Какой смысл?

Ответы

Ответ 1

Дело в том, что JSONArray и JSONObject предназначены для (де) сериализации данных в JSON, а не для обработки данных. Метод remove() может показаться имеющим смысл, но где предел? Вы ожидаете, что сможете получить доступ к атрибутам на сериализованных объектах? Доступ или обновление вложенных структур данных?

Идея заключается в том, что вы управляете структурами данных "изначально".

Ответ 2

Это полезно иногда в android, когда вы хотите напрямую использовать структуру json, без цикла для конвертирования. Используйте это только тогда, когда вы делаете такие вещи, как удаление строки на длинных кликах или что-то в этом роде. Не используйте это внутри цикла!

Обратите внимание, что я использую это только при обработке JSONObject внутри массива.

public static JSONArray remove(final int idx, final JSONArray from) {
    final List<JSONObject> objs = asList(from);
    objs.remove(idx);

    final JSONArray ja = new JSONArray();
    for (final JSONObject obj : objs) {
        ja.put(obj);
    }

    return ja;
}

public static List<JSONObject> asList(final JSONArray ja) {
    final int len = ja.length();
    final ArrayList<JSONObject> result = new ArrayList<JSONObject>(len);
    for (int i = 0; i < len; i++) {
        final JSONObject obj = ja.optJSONObject(i);
        if (obj != null) {
            result.add(obj);
        }
    }
    return result;
}

Ответ 3

Я использую:

public static JSONArray removeFrom(JSONArray jsonArray, int pos){
    JSONArray result = new JSONArray();
    try {
        for (int i = 0; i < jsonArray.length(); i++) {
            if (i != pos) {
                jsonArray.put(jsonArray.get(i));
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return result;
}

Ответ 4

Вы можете проверить это сейчас. Похоже, что API 19 от Android (4.4) фактически позволяет этот метод.

Call requires API level 19 (current min is 16): org.json.JSONArray#remove

Я получил эту ошибку, пытаясь ее использовать. Надеюсь, он поможет вам, теперь, когда он там!