📅  最后修改于: 2023-12-03 15:23:57.394000             🧑  作者: Mango
rapidjson 是一个快速的 C++ JSON 解析器/生成器,提供 SAX 和 DOM 风格的 API。本文将详细介绍如何使用 rapidjson 读取和解析 json 文件。
从 rapidjson 官网 下载最新版本的 rapidjson。
将下载的 rapidjson 解压到你的项目目录中。
在你的代码中导入 rapidjson 头文件。
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
我们将演示如何读取以下 json 文本文件:
{
"name": "Tom",
"age": 25,
"address": {
"city": "Beijing",
"street": "No. 1 Rd"
},
"hobby": ["reading", "swimming", "running"]
}
Document
对象rapidjson::Document doc;
FileReadStream
将 json 文件打开FILE* fp = fopen("example.json", "r");
char readBuffer[65536];
rapidjson::FileReadStream is(fp, readBuffer, sizeof(readBuffer));
ParseStream
解析 json 文件并关闭文件流doc.ParseStream(is);
fclose(fp);
HasMember
和 []
方法获取 json 中的值assert(doc.HasMember("name"));
assert(doc["name"].IsString());
const char* name = doc["name"].GetString();
assert(doc.HasMember("age"));
assert(doc["age"].IsInt());
int age = doc["age"].GetInt();
assert(doc.HasMember("address"));
const rapidjson::Value& address = doc["address"];
assert(address.IsObject());
assert(address.HasMember("city"));
assert(address["city"].IsString());
const char* city = address["city"].GetString();
assert(address.HasMember("street"));
assert(address["street"].IsString());
const char* street = address["street"].GetString();
assert(doc.HasMember("hobby"));
const rapidjson::Value& hobby = doc["hobby"];
assert(hobby.IsArray());
for (rapidjson::SizeType i = 0; i < hobby.Size(); i++) {
assert(hobby[i].IsString());
const char* h = hobby[i].GetString();
}
Reader
对象class MyHandler : public rapidjson::BaseReaderHandler<> {
public:
bool String(const char* str, rapidjson::SizeType length, bool copy) {
// TODO: 处理字符串
return true;
}
bool Int(int i) {
// TODO: 处理整数
return true;
}
bool StartObject() {
// TODO: 处理对象开始
return true;
}
bool EndObject(rapidjson::SizeType memberCount) {
// TODO: 处理对象结束
return true;
}
bool StartArray() {
// TODO: 处理数组开始
return true;
}
bool EndArray(rapidjson::SizeType elementCount) {
// TODO: 处理数组结束
return true;
}
};
rapidjson::Reader reader;
MyHandler handler;
FileReadStream
将 json 文件打开FILE* fp = fopen("example.json", "r");
char readBuffer[65536];
rapidjson::FileReadStream is(fp, readBuffer, sizeof(readBuffer));
ParseStream
解析 json 文件并关闭文件流reader.Parse(is, handler);
fclose(fp);
本文介绍了如何使用 rapidjson 读取和解析 json 文件,使用 DOM API 和 SAX API 两种方式,提供了代码示例和说明,希望对你有所帮助。