gpt4 book ai didi

java - 从 JSONArray Java 中删除条目

转载 作者:行者123 更新时间:2023-12-01 20:07:41 29 4
gpt4 key购买 nike

我有以下 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"
}
]
}
}

我的目标是从两个数组中删除“value”键中的值未出现在父键中的条目。我正在使用这个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"
}]
}
}

有人能猜出发生了什么吗?

最佳答案

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

基本上,执行相反的操作 - 不删除,而是添加您想要查看的数据并覆盖以前的数据

关于java - 从 JSONArray Java 中删除条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47181730/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com