Почему в JSONArray для Android нет метода удаления (int position)? - PullRequest
13 голосов
/ 03 сентября 2010

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

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

Ответы [ 4 ]

19 голосов
/ 21 сентября 2012

Это полезно иногда в 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;
}
11 голосов
/ 27 ноября 2013

Я использую:

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;
}
7 голосов
/ 17 ноября 2013

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

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

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

7 голосов
/ 18 сентября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...