我正在使用jsoncpp,我有一组数据如下,我想搜索一些节点并删除数组元素,一些当我删除时,它变成{},是否可以用{}完全删除?
删除前的数据:
{
"any" : [
{
"any_id" : "a1",
"infos" : [
{
"info_id" : "i1",
"path" : "",
"version" : "1.0"
}
]
},
{
"any_id" : "a2",
"infos" : [
{
"info_id" : "i1",
"path" : "",
"version" : "1.0"
},
{
"info_id" : "i2",
"path" : "D:\\",
"version" : "1.0"
},
{
"info_id" : "i3",
"path" : "",
"version" : "1.0"
},
{
"info_id" : "i4",
"path" : "D:\\",
"version" : "1.0"
}
]
},
{
"any_id" : "a3",
"infos" : [
{
"info_id" : "i4",
"path" : "",
"version" : "1.0"
}
]
}
]
}
删除后的数据:
{
"any" : [
{
"any_id" : "a1",
"infos" : [
{
"info_id" : "i1",
"path" : "",
"version" : "1.0"
}
]
},
{
"any_id" : "a2",
"infos" : [
{
"info_id" : "i1",
"path" : "",
"version" : "1.0"
},
{
},
{
"info_id" : "i3",
"path" : "",
"version" : "1.0"
},
{
}
]
},
{
"any_id" : "a3",
"infos" : [
{
"info_id" : "i4",
"path" : "",
"version" : "1.0"
}
]
}
]
}
在C ++中,我有以下代码,查找any_id和删除数组元素的路径:
for (Json::ValueIterator &itr_any = data["any"].begin();
itr_any != data["any"].end(); ++itr_any)
{
if (0 == _stricmp((*itr_any)["any_id"].asString().c_str(), "a2"))
{
for (Json::ValueIterator &itr_res = (*itr_any)["infos"].begin();
itr_res != (*itr_any)["infos"].end(); ++itr_res)
{
if (0 == _stricmp((*itr_res)["path"].asString().c_str(), "D:\\"))
{
(*itr_res).clear();
}
}
}
}
答案 0 :(得分:2)
使用(*itr_res).clear();
实际上是清空所选数组中对象的内容。
JsonCpp API不公开操作数组的方法,因此删除项目的最简单方法是构建一个不包含匹配元素的新数组:
for (Json::ValueIterator &itr_any = data["any"].begin(); itr_any != data["any"].end(); ++itr_any)
if (0 == _stricmp((*itr_any)["any_id"].asString().c_str(), "a2"))
{
Json::Value newArray = Json::arrayValue;
for (Json::ValueIterator &itr_res = (*itr_any)["infos"].begin(); itr_res != (*itr_any)["infos"].end(); ++itr_res)
if (_stricmp((*itr_res)["path"].asString().c_str(), "D:\\"))
newArray.append((*itr_res));
(*itr_any)["infos"] = newArray;
}