使用TJsonObject的RemovePair方法删除嵌套JSON键不生效问题咨询
问题原因
- 第一,C++ Builder的
TJSONObject::RemovePair方法仅支持删除当前对象直接子级的键,不支持传入点分隔的嵌套路径自动层级匹配。你传入的Test.A.ins.type.id.values.test_number会被识别为根JSON对象下的一个直接子键名,你的JSON根级不存在该键,因此删除操作无效果。 - 第二,你写的嵌套路径本身存在结构错误:参考给出的JSON结构,
id是ins的直接子键,和type平级,并非type的子键,正确的层级路径应该是Test -> A -> ins -> id -> values -> test_number。
正确删除嵌套键的实现方式
需要逐层获取嵌套的JSONObject,最终定位到目标键的父对象后再执行删除操作,建议增加空指针判断避免访问异常。参考代码如下:
TJSONObject *root = (TJSONObject*) TJSONObject::ParseJSONValue(TEncoding::UTF8->GetString(id_http_wrap.msg)); if (root) { // 逐层获取嵌套对象 TJSONObject* testObj = dynamic_cast<TJSONObject*>(root->GetValue("Test")); if (testObj) { TJSONObject* aObj = dynamic_cast<TJSONObject*>(testObj->GetValue("A")); if (aObj) { TJSONObject* insObj = dynamic_cast<TJSONObject*>(aObj->GetValue("ins")); if (insObj) { TJSONObject* idObj = dynamic_cast<TJSONObject*>(insObj->GetValue("id")); if (idObj) { TJSONObject* valuesObj = dynamic_cast<TJSONObject*>(idObj->GetValue("values")); if (valuesObj) { // 定位到values对象后删除test_number键 valuesObj->RemovePair("test_number"); } } } } } // 后续输出日志等业务逻辑 // ... delete root; // 用完释放ParseJSONValue返回的对象,避免内存泄漏 }
如果需要频繁操作嵌套键,可以自行封装通用工具函数,将点分路径拆分后自动逐层查找执行删除即可。
内容的提问来源于stack exchange,提问作者user2020
相关产品推荐
相关产品推荐

