我有以下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"
}]
}
}
有人可以猜出发生了什么吗?
答案 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()