从JSONArray Java中删除条目

时间:2017-11-08 14:03:41

标签: java arrays json

我有以下json:

{
    "scenes": {
        "A-B-C": [{
                "id": "OPENINGS",
                "value": "A"
            },
            {
                "id": "VIEW",
                "value": "B"
            },
            {
                "id": "CAMERA",
                "value": "C"
            },
            {
                "id": "VIEW",
                "value": "D"    //this should be removed
            },
            {
                "id": "CAMERA",
                "value": "E" //this should be removed
            }
        ],
        "A-D-E": [{
                "id": "OPENINGS",
                "value": "A"
            },
            {
                "id": "VIEW",
                "value": "B"   //this should be removed
            },
            {
                "id": "CAMERA",
                "value": "C"  //this should be removed
            },
            {
                "id": "VIEW",
                "value": "D"
            },
            {
                "id": "CAMERA",
                "value": "E"  
            }
        ]
    }
}

我的目标是从两个数组中的每个数组中删除"值"中值的条目。密钥不会出现在父密钥中。 我正在使用这个java代码:

        Set<String> keys = modelJSON.getJSONObject("scenes").keySet();
        List<Integer> remove = new ArrayList<Integer>();
        for (String keyValue : keys) {
            JSONArray array = modelJSON.getJSONObject("scenes").getJSONArray(keyValue);
            remove.clear();
            int l = array.length();
            for (int i = 0; i < l; i++) {
                String target = modelJSON.getJSONObject("scenes").getJSONArray(keyValue).getJSONObject(i).getString("value");
                if (!keyValue.contains(target)) {
                    remove.add(i);
                }
            }
            Collections.sort(remove, Collections.reverseOrder());
            for (int j : remove) {
                array.remove(j);
            }
            modelJSON.getJSONObject("scenes").put(keyValue, array);
        }

在调试器中,我看到代码完全正常,直到最后一行。 array变量包含在执行最后一行之前所需的条目。问题是,当执行put函数时,在每个父键中替换新数组。导致这个结果:

{
    "scenes": {
        "A-B-C": [{
            "id": "OPENINGS",
            "value": "000002_01"
        }],
        "A-D-E": [{
            "id": "OPENINGS",
            "value": "000002_01"
        }]
    }
}

有人可以猜出发生了什么吗?

2 个答案:

答案 0 :(得分:1)

array.remove(j);本身不会更改您的JSON数据。就个人而言,我没有看到这个array变量的目的。

由于JSON不能有重复的密钥,因此当您put(keyValue, array)时,它会覆盖旧的值。尝试调试代码以观察该数组缩小。

您似乎想要放置remove列表。

创建一个新的JSONArray,并向其添加modelJSON.getJSONObject("scenes").getJSONArray(keyValue).getJSONObject(i)。然后把那个

像这样的东西

 JSONArray newArray = new JSONArray();
JSONObject scenes = modelJSON.getJSONObject("scenes");
JSONArray array = scenes.getJSONArray(keyValue);
for (int i=0; i<array.length();i++){
    JSONObject target = array.getJSONObject(i);
    if (!keyValue.contains( target.getString("value")) ){
        newArray.put(target);
    }
}
scenes.put(keyValue, newArray);
// modelJSON.put("scenes", scenes);  // maybe necessary 

基本上,反之亦然 - 不要删除,而是添加想要查看的数据并覆盖以前的数据

答案 1 :(得分:1)

只需从JSONArray中删除该职位

array.remove(position) notifyDataSetChanged()