如何使用RapidJson读取和解析Json文件?
RapidJSON是一个高性能的C++ JSON库。它提供了一个快速且易于使用的界面用于解析和生成JSON。它小巧而完整,支持SAX和DOM方式的API。此外,它是自包含且仅有头文件的,不依赖于外部库,例如BOOST,甚至不依赖于STL。这里是使用RapidJSON解析JSON文件的示例。
示例1:
#include "rapidjson/document.h"
#include "rapidjson/filereadstream.h"
#include <cstdio>
int main()
{
//打开文件
FILE* fp = fopen("test.json", "rb");
//将文件读入缓冲区
char readBuffer[65536];
rapidjson::FileReadStream is(fp, readBuffer,
sizeof(readBuffer));
//解析JSON文档
rapidjson::Document doc;
doc.ParseStream(is);
//关闭文件
fclose(fp);
//使用文档中的数据
// ...
return 0;
}
此示例将名称为 “test.json” 的文件的内容读入缓冲区,然后使用ParseStream函数解析JSON文档。解析的文档存储在 rapidjson :: Document 对象中,该对象提供对JSON文档中数据的访问。您可以使用 rapidjson :: Document 类的各种成员函数访问文档中的数据。例如,要访问对象成员,可以使用GetObject函数,要访问数组成员,则可以使用GetArray函数。您还可以使用HasMember函数检查对象是否具有特定成员,以及使用Size函数获取数组的大小。以下是更详细的使用RapidJSON解析JSON文件的示例,其中解释了每个步骤:
示例2:
#include "rapidjson/document.h"
#include "rapidjson/filereadstream.h"
#include <cstdio>
#include <iostream>
int main()
{
// 打开文件
FILE* fp = fopen("test.json", "rb");
// 检查文件是否成功打开
if (!fp) {
std::cerr << "错误:无法打开文件"
<< std::endl;
return 1;
}
// 将文件读入缓冲区
char readBuffer[65536];
rapidjson::FileReadStream is(fp, readBuffer,
sizeof(readBuffer));
// 解析 JSON 文件
rapidjson::Document doc;
doc.ParseStream(is);
// 检查文档是否有效
if (doc.HasParseError()) {
std::cerr << "错误:无法解析 JSON 文档"
<< std::endl;
fclose(fp);
return 1;
}
// 关闭文件
fclose(fp);
// 访问文档中的数据
// 假设 JSON 文档具有以下结构:
// {
// "name": "John Smith",
// "age": 30,
// "city": "New York",
// "skills": ["programming", "guitar", "singing"]
// }
// 获取 "name" 成员
if (doc.HasMember("name") && doc["name"].IsString()) {
std::string name = doc["name"].GetString();
std::cout << "姓名:" << name << std::endl;
}
// 获取 "age" 成员
if (doc.HasMember("age") && doc["age"].IsInt()) {
int age = doc["age"].GetInt();
std::cout << "年龄:" << age << std::endl;
}
// 获取 "city" 成员
if (doc.HasMember("city") && doc["city"].IsString()) {
std::string city = doc["city"].GetString();
std::cout << "城市:" << city << std::endl;
}
// 获取 "skills" 数组
if (doc.HasMember("skills")
&& doc["skills"].IsArray()) {
const rapidjson::Value& skills = doc["skills"];
std::cout << "技能:";
for (rapidjson::SizeType i = 0; i < skills.Size();
i++) {
if (skills[i].IsString()) {
std::string skill = skills[i].GetString();
std::cout << skill << " ";
}
}
std::cout << std::endl;
}
return 0;
}
示例 test.json:
输出:
示例解释:
在这个例子中,我们首先使用 fopen 函数打开 “test.json” 文件。然后,我们使用 rapidjson::FileReadStream 类将文件的内容读入缓冲区。解析 JSON 文档意味着将 JSON 格式化字符串转换为 JSON 对象,以便在程序中访问和操作。RapidJSON 提供了几个用于解析 JSON 的函数,包括:
- Parse:解析 JSON 字符串
- ParseInsitu:就地解析 JSON 字符串(即,不制作字符串的副本)
- ParseStream:从输入流解析 JSON 文档
一旦解析了 JSON 文档,您就可以使用 rapidjson::Document 类的各种成员函数访问文档中的数据。例如:
- IsObject:如果文档是对象,则返回true。
- IsArray:如果文档是数组,则返回true。
- IsString:如果文档是字符串,则返回true。
- IsNumber:如果文档是数字(整数或浮点数),则返回true。
- IsBool:如果文档是布尔值,则返回true。
- GetObject:返回文档中指定路径处的对象。
- GetArray:返回文档中指定路径处的数组。
- GetString:返回文档中指定路径处的字符串。
- GetInt:返回文档中指定路径处的整数。
- GetUint:返回文档中指定路径处的无符号整数。
- GetInt64:返回文档中指定路径处的64位整数。
- GetUint64:返回文档中指定路径处的64位无符号整数。
- GetDouble:返回文档中指定路径处的双精度浮点数。
- GetBool:返回文档中指定路径处的布尔值。
以下是使用这些函数访问JSON文档数据的例子:
示例3:
#include "rapidjson/document.h"
int main()
{
// 解析JSON文档
rapidjson::Document doc;
doc.Parse("{\"name\":\"John\",\"age\":30,\"city\":"
"\"New York\"}");
// 访问文档中的数据
if (doc.IsObject()) {
// 获取"name"成员
if (doc.HasMember("name") && doc["name"].IsString()) {
std::string name = doc["name"].GetString();
std::cout << "Name: " << name << std::endl;
// 输出:Name: John
}
// 获取"age"成员
if (doc.HasMember("age") && doc["age"].IsInt()) {
int age = doc["age"].GetInt();
std::cout << "Age: " << age << std::endl;
// 输出:Age: 30
}
// 获取"city"成员
if (doc.HasMember("city") && doc["city"].IsString()) {
std::string city = doc["city"].GetString();
std::cout << "City: " << city << std::endl;
// 输出:City: New York
}
}
return 0;
}
输出:
这段代码使用rapidjson::Document对象的Parse()方法解析字符串文本{“name”:”John”,”age”:30,”city”:”New York”}
中包含的JSON文档。然后访问文档并提取“name”、“age”和“city”成员的值并打印到控制台。