Почему в 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
Я получил эту ошибку, пытаясь ее использовать. Надеюсь, он поможет вам, теперь, когда он там!