C++ 实现根据字符串查找JSON 节点
时间: 2024-03-27 08:38:01 浏览: 63
你可以使用第三方库,如:RapidJSON 或 JsonCPP 来解析 JSON 字符串,然后通过遍历 JSON 树的方式查找目标节点。
以下是一个使用 RapidJSON 库实现的示例代码:
```c++
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
#include <string>
using namespace rapidjson;
using namespace std;
Value* findNode(Value& root, const string& nodeName) {
if (root.IsObject()) {
for (Value::MemberIterator it = root.MemberBegin(); it != root.MemberEnd(); ++it) {
if (it->name == nodeName) {
return &it->value;
}
else {
Value* result = findNode(it->value, nodeName);
if (result != nullptr) {
return result;
}
}
}
}
else if (root.IsArray()) {
for (Value::ValueIterator it = root.Begin(); it != root.End(); ++it) {
Value* result = findNode(*it, nodeName);
if (result != nullptr) {
return result;
}
}
}
return nullptr;
}
int main() {
// JSON 字符串
string jsonStr = R"(
{
"name": "Tom",
"age": 20,
"address": {
"province": "Guangdong",
"city": "Shenzhen",
"detail": {
"street": "123 Main St.",
"zipCode": "518000"
}
},
"hobbies": [
"reading",
"swimming"
]
}
)";
Document doc;
doc.Parse(jsonStr.c_str());
// 查找节点
string nodeName = "zipCode";
Value* node = findNode(doc, nodeName);
if (node != nullptr) {
cout << "Node \"" << nodeName << "\" found: " << node->GetString() << endl;
}
else {
cout << "Node \"" << nodeName << "\" not found." << endl;
}
return 0;
}
```
在上述代码中,我们首先使用 `Parse()` 方法将 JSON 字符串解析为 RapidJSON 的 `Document` 对象,然后通过递归遍历节点的方式查找目标节点。`findNode()` 函数接受两个参数,第一个是当前节点,第二个是目标节点的名称。如果当前节点是一个对象,则递归遍历其成员;如果当前节点是一个数组,则递归遍历其元素;如果当前节点不是对象也不是数组,则返回 `nullptr`。当找到目标节点时,返回该节点的指针;否则返回 `nullptr`。
阅读全文