使用RapidJson开源库解析和生成Json数据
RapidJSON是一个高效、轻量级的 C++ JSON 解析器及生成器库,由腾讯公司开源。RapidJSON 是只有头文件的 C++ 库。只需把 include/rapidjson 目录复制到项目中即可使用。
·
RapidJSON介绍
- RapidJSON是一个高效、轻量级的 C++ JSON 解析器及生成器库,由腾讯公司开源。
- RapidJSON 是只有头文件的 C++ 库。只需把 include/rapidjson 目录复制到项目中即可使用。
- 中文文档
使用介绍
基础json数据生成
- 代码
-
#include <iostream> #include "rapidjson/document.h" // 快速JSON文档操作 #include "rapidjson/writer.h" // JSON写入器 #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串 int main(){ // 创建一个新的 JSON 对象 rapidjson::Document doc; doc.SetObject(); /* * rapidjson::StringRef("John") 对源字符串进行了引用,不进行字符串的拷贝 * rapidjson::Value("John") 对源字符串进行了拷贝 */ // 添加成员 // doc.AddMember("name", rapidjson::StringRef("John"), doc.GetAllocator()); doc.AddMember("name", rapidjson::Value("John").Move(), doc.GetAllocator()); doc.AddMember("age", rapidjson::Value(30).Move(), doc.GetAllocator()); doc.AddMember("score", rapidjson::Value(90.5).Move(), doc.GetAllocator()); // 创建字符串缓冲区和写入器 rapidjson::StringBuffer buffer; rapidjson::Writer<rapidjson::StringBuffer> writer(buffer); // 将文档写入缓冲区 doc.Accept(writer); // 输出生成的 JSON 字符串 std::cout << buffer.GetString() << std::endl; return 0; }
-
- 生成结果(为了查看方便,对结果手动进行了换行)
-
{ "name":"John", "age":30, "score":90.5 }
-
多级json数据生成
-
代码
-
#include <iostream> #include "rapidjson/document.h" // 快速JSON文档操作 #include "rapidjson/writer.h" // JSON写入器 #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串 int main(){ // 创建 RapidJson 文档对象和内存分配器 rapidjson::Document doc; doc.SetObject(); rapidjson::Document::AllocatorType& allocator = doc.GetAllocator(); doc.AddMember("code", rapidjson::Value(10010).Move(), allocator); // 第一层数据 doc.AddMember("person", rapidjson::Value().SetObject(), allocator); doc["person"].AddMember("name", rapidjson::Value("John").Move(), allocator); doc["person"].AddMember("age", rapidjson::Value(30).Move(), allocator); doc["person"].AddMember("score", rapidjson::Value(90.5).Move(), allocator); doc.AddMember("class", rapidjson::Value("5").Move(), allocator); // 序列化 JSON 到字符串 rapidjson::StringBuffer buffer; rapidjson::Writer<rapidjson::StringBuffer> writer(buffer); doc.Accept(writer); // 输出生成的 JSON 字符串 std::cout << buffer.GetString() << std::endl; return 0; }
-
-
生成结果
-
{ "code":10010, "person":{ "name":"John", "age":30, "score":90.5 }, "class":"5" }
-
含有数组的json数据生成
- 代码
-
#include <iostream> #include "rapidjson/document.h" // 快速JSON文档操作 #include "rapidjson/writer.h" // JSON写入器 #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串 int main(){ // 创建 RapidJson 文档对象和内存分配器 rapidjson::Document doc; doc.SetObject(); rapidjson::Document::AllocatorType& allocator = doc.GetAllocator(); doc.AddMember("code", rapidjson::Value(10010).Move(), allocator); // 第一层数据 doc.AddMember("person", rapidjson::Value().SetObject(), allocator); doc["person"].AddMember("name", rapidjson::Value("John").Move(), allocator); doc["person"].AddMember("age", rapidjson::Value(30).Move(), allocator); doc["person"].AddMember("score", rapidjson::Value(90.5).Move(), allocator); doc.AddMember("class", rapidjson::Value("5").Move(), allocator); rapidjson::Value interests(rapidjson::kArrayType); interests.PushBack(rapidjson::Value("math").Move(), allocator); interests.PushBack(rapidjson::Value("chinese").Move(), allocator); interests.PushBack(rapidjson::Value("english").Move(), allocator); doc.AddMember("lesson", interests, allocator); // 序列化 JSON 到字符串 rapidjson::StringBuffer buffer; rapidjson::Writer<rapidjson::StringBuffer> writer(buffer); doc.Accept(writer); // 输出生成的 JSON 字符串 std::cout << buffer.GetString() << std::endl; return 0; }
-
- 生成结果
-
{ "code":10010, "person":{ "name":"John", "age":30, "score":90.5 }, "class":"5", "lesson":["math","chinese","english"] }
-
含有数组对象的json数据生成
- 代码
-
#include <iostream> #include "rapidjson/document.h" // 快速JSON文档操作 #include "rapidjson/writer.h" // JSON写入器 #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串 int main(){ // 创建 RapidJson 文档对象和内存分配器 rapidjson::Document doc; doc.SetObject(); rapidjson::Document::AllocatorType& allocator = doc.GetAllocator(); doc.AddMember("code", rapidjson::Value(10010).Move(), allocator); doc.AddMember("person", rapidjson::Value().SetObject(), allocator); doc["person"].AddMember("name", rapidjson::Value("John").Move(), allocator); doc["person"].AddMember("age", rapidjson::Value(30).Move(), allocator); doc["person"].AddMember("score", rapidjson::Value(90.5).Move(), allocator); doc.AddMember("class", rapidjson::Value("5").Move(), allocator); rapidjson::Value array(rapidjson::kArrayType); array.SetArray(); rapidjson::Value obj1(rapidjson::kObjectType); obj1.AddMember("lessonName", rapidjson::StringRef("math"), allocator); obj1.AddMember("time", rapidjson::Value(8).Move(), allocator); array.PushBack(obj1.Move(), allocator); rapidjson::Value obj2(rapidjson::kObjectType); obj2.AddMember("lessonName", rapidjson::StringRef("chinese"), allocator); obj2.AddMember("time", rapidjson::Value(9).Move(), allocator); array.PushBack(obj2.Move(), allocator); rapidjson::Value obj3(rapidjson::kObjectType); obj3.AddMember("lessonName", rapidjson::StringRef("english"), allocator); obj3.AddMember("time", rapidjson::Value(6).Move(), allocator); array.PushBack(obj3.Move(), allocator); doc.AddMember("lesson", array, allocator); // 序列化 JSON 到字符串 rapidjson::StringBuffer buffer; rapidjson::Writer<rapidjson::StringBuffer> writer(buffer); doc.Accept(writer); // 输出生成的 JSON 字符串 std::cout << buffer.GetString() << std::endl; return 0; }
-
- 生成结果
-
{ "code":10010, "person":{ "name":"John", "age":30, "score":90.5 }, "class":"5", "lesson":[ {"lessonName":"math","time":8}, {"lessonName":"chinese","time":9}, {"lessonName":"english","time":6} ] }
-
基础json数据解析
- json数据
-
{ "name": "John", "age": 30, "score": 19.5 }
-
- 代码
-
#include <iostream> #include "rapidjson/document.h" // 快速JSON文档操作 #include "rapidjson/writer.h" // JSON写入器 #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串 int main(){ const char* jsonStr = "{\"name\": \"John\", \"age\": 30, \"score\": 19.5}"; // 1. 创建一个 RapidJSON 的 Document 对象来持有 JSON 数据 rapidjson::Document d; // 2. 使用 Parse 函数解析 JSON 字符串 // 参数ParseFlag::kParseComments 是可选的,用于允许解析带注释的 JSON d.Parse(jsonStr); // 3. 检查解析是否成功 if (d.HasParseError()) { std::cerr << "JSON parse error: " << d.GetParseError() << std::endl; return -1; } // 4. 访问 JSON 数据 if (d.HasMember("name") && d["name"].IsString()) { std::cout << "Name: " << d["name"].GetString() << std::endl; } if (d.HasMember("age") && d["age"].IsInt()) { std::cout << "age: " << d["age"].GetInt() << std::endl; } if (d.HasMember("score") && d["score"].IsFloat()) { std::cout << "score: " << d["score"].GetFloat() << std::endl; } return 0; }
-
- 打印
-
Name: John age: 30 score: 19.5
-
多级json数据解析
- json数据
-
{ "code": 10010, "person": { "name": "John", "age": 30, "score": 90.5 }, "class": "5" }
-
- 代码
-
#include <iostream> #include "rapidjson/document.h" // 快速JSON文档操作 #include "rapidjson/writer.h" // JSON写入器 #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串 int main(){ const char* jsonStr = "{\"code\": 10010, \"person\": {\"name\": \"John\", \"age\": 30,\"score\": 90.5 },\"class\": \"5\"}"; // 1. 创建一个 RapidJSON 的 Document 对象来持有 JSON 数据 rapidjson::Document d; // 2. 使用 Parse 函数解析 JSON 字符串 // 参数ParseFlag::kParseComments 是可选的,用于允许解析带注释的 JSON d.Parse(jsonStr); // 3. 检查解析是否成功 if (d.HasParseError()) { std::cerr << "JSON parse error: " << d.GetParseError() << std::endl; return -1; } if (d.HasMember("code") && d["code"].IsInt()) { std::cout << "code: " << d["code"].GetInt() << std::endl; } if (d.HasMember("person")) { if (d["person"].HasMember("name") && d["person"]["name"].IsString()) { std::cout << "person->name: " << d["person"]["name"].GetString() << std::endl; } if (d["person"].HasMember("age") && d["person"]["age"].IsInt()) { std::cout << "person->age: " << d["person"]["age"].GetInt() << std::endl; } if (d["person"].HasMember("score") && d["person"]["score"].IsFloat()) { std::cout << "person->score: " << d["person"]["score"].GetFloat() << std::endl; } } if (d.HasMember("class") && d["class"].IsString()) { std::cout << "class: " << d["class"].GetString() << std::endl; } return 0; }
-
- 打印
-
code: 10010 person->name: John person->age: 30 person->score: 90.5 class: 5
-
含有数组的json数据解析
- json数据
-
{ "code": 10010, "lesson": ["math", "chinese", "english"], "class": "5" }
-
- 代码
-
#include <iostream> #include "rapidjson/document.h" // 快速JSON文档操作 #include "rapidjson/writer.h" // JSON写入器 #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串 int main(){ const char* jsonStr = "{\"code\": 10010, \"lesson\": [\"math\", \"chinese\", \"english\"], \"class\": \"5\"}"; // 1. 创建一个 RapidJSON 的 Document 对象来持有 JSON 数据 rapidjson::Document d; // 2. 使用 Parse 函数解析 JSON 字符串 // 参数ParseFlag::kParseComments 是可选的,用于允许解析带注释的 JSON d.Parse(jsonStr); // 3. 检查解析是否成功 if (d.HasParseError()) { std::cerr << "JSON parse error: " << d.GetParseError() << std::endl; return -1; } if (d.HasMember("code") && d["code"].IsInt()) { std::cout << "code: " << d["code"].GetInt() << std::endl; } if (d.HasMember("lesson") && d["lesson"].IsArray()) { const rapidjson::Value& lesson = d["lesson"]; std::cout << "lesson"; for (rapidjson::SizeType i = 0; i < lesson.Size(); i++) { if (lesson[i].IsString()) { std::cout << "\t" << lesson[i].GetString() << std::endl; } } } if (d.HasMember("class") && d["class"].IsString()) { std::cout << "class: " << d["class"].GetString() << std::endl; } return 0; }
-
- 打印
-
code: 10010 lesson math chinese english class: 5
-
含有数组对象的json数据解析
- json数据
-
{ "code": 10010, "lesson":[ {"lessonName": "math", "time": 8}, {"lessonName": "chinese", "time": 9}, {"lessonName": "english", "time":6} ] }
-
- 代码
-
#include <iostream> #include "rapidjson/document.h" // 快速JSON文档操作 #include "rapidjson/writer.h" // JSON写入器 #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串 int main(){ const char* jsonStr = "{\"code\": 10010, \"lesson\":[{\"lessonName\": \"math\", \"time\": 8},{\"lessonName\": \"chinese\", \"time\": 9},{\"lessonName\": \"english\", \"time\":6}]}"; // 1. 创建一个 RapidJSON 的 Document 对象来持有 JSON 数据 rapidjson::Document d; // 2. 使用 Parse 函数解析 JSON 字符串 // 参数ParseFlag::kParseComments 是可选的,用于允许解析带注释的 JSON d.Parse(jsonStr); // 3. 检查解析是否成功 if (d.HasParseError()) { std::cerr << "JSON parse error: " << d.GetParseError() << std::endl; return -1; } if (d.HasMember("code") && d["code"].IsInt()) { std::cout << "code: " << d["code"].GetInt() << std::endl; } if (d.HasMember("lesson") && d["lesson"].IsArray()) { const rapidjson::Value& employeesArray = d["lesson"]; for (rapidjson::SizeType i = 0; i < employeesArray.Size(); i++) { if (employeesArray[i].IsObject()) { const rapidjson::Value& employee = employeesArray[i]; std::cout << "lesson " << i << ":" << std::endl; if (employee.HasMember("lessonName") && employee["lessonName"].IsString()) { std::cout << "\t" << "lessonName: " << employee["lessonName"].GetString() << std::endl; } if (employee.HasMember("time") && employee["time"].IsInt()) { std::cout << "\t" << "time: " << employee["time"].GetInt() << std::endl; } } } } return 0; }
-
- 打印
-
code: 10010 lesson 0: lessonName: math time: 8 lesson 1: lessonName: chinese time: 9 lesson 2: lessonName: english time: 6
-
修改、移除、新增json节点
- json数据
-
{ "code": 10010, "person": { "name": "John", "age": 30, "score": 90.5 }, "class": "5" }
-
- 代码
-
#include <iostream> #include "rapidjson/document.h" // 快速JSON文档操作 #include "rapidjson/writer.h" // JSON写入器 #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串 int main(){ // 1. 把 JSON 解析至 DOM。 const char* json = "{\"code\": 10010, \"person\": {\"name\": \"John\", \"age\": 30,\"score\": 90.5 },\"class\": \"5\"}"; rapidjson::Document d; d.Parse(json); // 2. 利用 DOM 作出修改。 rapidjson::Value& code = d["code"]; code.SetInt(10020); rapidjson::Value& name = d["person"]["name"]; name.SetString("Jack"); // 移除某个节点 d.RemoveMember("class"); // 新增节点 rapidjson::Value newValue("6", d.GetAllocator()); d.AddMember("classTemp", newValue, d.GetAllocator()); // 3. 把 DOM 转换(stringify)成 JSON。 rapidjson::StringBuffer buffer; rapidjson::Writer<rapidjson::StringBuffer> writer(buffer); d.Accept(writer); std::cout << buffer.GetString() << std::endl; return 0; }
-
- 打印
-
{ "code":10020, "person":{ "name":"Jack", "age":30, "score":90.5 }, "classTemp":"6" }
-
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献30条内容
所有评论(0)