源代码

#include <iostream> // 引入输入输出流库,用于标准输入输出操作
#include <fstream> // 引入文件流库,用于文件读写操作
#include <json/json.h> // 引入JSON库,用于解析和操作JSON数据
using namespace std; // 使用标准命名空间,避免每次调用标准库函数时都要加std::
int main()
{
Json::Value root; // 创建一个Json::Value对象,用于存储解析后的JSON数据
ifstream ifs; // 创建一个输入文件流对象,用于读取文件
ifs.open("profile.json"); // 打开名为"profile.json"的文件
Json::CharReaderBuilder builder; // 创建一个JSON解析器的构建器对象
builder["collectComments"] = true; // 设置解析器在解析时收集注释
JSONCPP_STRING errs; // 创建一个字符串对象,用于存储解析过程中可能产生的错误信息
// 使用解析器从文件流中解析JSON数据,并将结果存储在root对象中
// 如果解析失败,输出错误信息并返回EXIT_FAILURE
if (!parseFromStream(builder, ifs, &root, &errs))
{
std::cout << errs << std::endl; // 输出错误信息
return EXIT_FAILURE; // 返回程序失败状态
}
Json::Value::iterator itr = root.begin(); // 创建一个迭代器,指向JSON对象的起始位置
int i = 0; // 初始化一个计数器,用于遍历JSON对象的成员
string name; // 创建一个字符串对象,用于存储JSON对象的成员名称
// 遍历JSON对象的每个成员
for (itr = root.begin(); itr != root.end(); itr++)
{
name = root.getMemberNames()[i]; // 获取当前成员的名称
// 如果当前成员的值是一个数组(大小大于1),则遍历数组中的每个元素
if (root[name].size() > 1) {
for (auto x : root[name]) {
cout << name << ": " << x << endl; // 输出成员名称和数组中的每个元素
}
}
else {
cout << name + " "; // 输出成员名称
cout << root[name] << endl; // 输出成员的值
}
i++; // 计数器加1,准备处理下一个成员
}
}
json内容为:
{
"isbn": "123-456-789",
"author":
{
"lastname": "Doe",
"firstname" : "Jane"
},
"editor":
{
"lastname": "Smith",
"firstname": "Jane"
},
"title": "The Ultimate Database Study Guide",
"category": ["Non-Fiction"