【问题标题】:Why isn't there a remove(int position) method in Android's JSONArray?为什么 Android 的 JSONArray 中没有 remove(int position) 方法?
【发布时间】:2010-09-03 19:39:33
【问题描述】:

我开始构建一个使用平面文件进行存储的 Android 应用。该应用程序存储的记录不超过六条,而且我对 JSON 很熟悉,所以我只是在文件中写了一个JSONArray

不过,我今天刚刚发现,Android JSON API 不包含remove() 选项。嗯?我是否必须将数组转储到另一个集合中,将其删除,然后重建 JSONArray?有什么意义?

【问题讨论】:

  • StackOverflow 用于编程问题和答案。有关 JSON API 的投诉应直接提交给 json.org 上的作者。或者,既然是开源的,欢迎大家实际修改,自己使用修改后的版本。
  • 其实这是一个android SDK的问题。在此处为问题加注星标,以便有人对其进行修补:code.google.com/p/android/issues/detail?id=53461

标签: android json


【解决方案1】:

当你想直接使用 json 结构而不循环转换时,这有时在 android 中很有用。请仅在您执行诸如删除长按或类似操作之类的操作时使用此选项。不要在循环中使用它!

请注意,我只在处理数组内的 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;
}

【讨论】:

    【解决方案2】:

    我用:

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

    【讨论】:

    • 当您需要在 API 上删除一行时,此解决方案对我很有效
    【解决方案3】:

    重点是JSONArrayJSONObject 旨在将数据(反)序列化为 JSON,而不是操作数据。 remove() 方法似乎有意义,但极限在哪里?您希望能够访问序列化对象的属性吗?访问或更新嵌套数据结构?

    确实,这个想法是您“本机”地操作数据结构。

    【讨论】:

    • 这是有道理的。在我的例子中,我有一个数据存储,由一个普通的数据对象(PO​​JO、Bean,无论你想怎么称呼它)和 List 组成。我应该直接处理这些对象,然后通过 JSON 写出它们的状态。
    • 你有一个公共 API,你不能仅仅因为你认为你的编码方式更好就随意地从中删除函数。
    • 我认为 org.json API 是 15 年前创建的。为什么不允许人们重新排序从 Internet 获取的 JSONObject 数组?为什么必须创建 List 而不是直接重新排序 JSONArray?循环的循环只是为了做同样的事情。
    • @RafaelSanches 我完全同意。语言应该努力做到有用,而不是引入需要额外制作的无意义的障碍。考虑到 JSON 的普遍存在(2020 年),令人惊讶的是,这仍然是一项需要手动处理的任务!
    【解决方案4】:

    您现在可能想检查一下。似乎来自 Android (4.4) 的 API 19 实际上允许这种方法。

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

    我在尝试使用它时遇到了这个错误。希望它对你有帮助,现在它就在那里!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 2021-04-03
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      相关资源
      最近更新 更多