为什么在Android的JSONArray中没有remove(int position)方法?

ala*_*nde 13 android json

我开始构建一个使用平面文件存储的Android应用程序.该应用程序不存储超过六个记录,我熟悉JSON,所以我只写出一个JSONArray文件.

不过,我今天才发现Android JSON API不包含remove()选项.咦?我是否必须将数组转储到另一个集合中,删除它,然后重建JSONArray?重点是什么?

Raf*_*hes 19

当你想直接使用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;
}
Run Code Online (Sandbox Code Playgroud)


Fab*_*rra 11

我用:

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;
}
Run Code Online (Sandbox Code Playgroud)


Ivo*_*ijk 7

重点是,JSONArray并且JSONObject意味着(de)将数据序列化为JSON,而不是操纵数据.一种remove()方法似乎有意义,但限制在哪里?您希望能够访问序列化对象的属性吗?访问或更新嵌套数据结构?

实际上,您的想法是"本机地"操纵数据结构.

  • 我认为org.json API是在15年前制作的.为什么不允许人们重新排序从互联网上获取的JSONObject数组?为什么必须创建List <JSONObject>而不是直接重新排序JSONArray?循环循环只是为了做同样的事情. (3认同)

小智 7

您可能想立即查看.看起来像Android(4.4)的API 19实际上允许这种方法.

Call requires API level 19 (current min is 16): org.json.JSONArray#remove
Run Code Online (Sandbox Code Playgroud)

我在尝试使用它时遇到了这个错误.希望它可以帮到你,现在它就在那里!