rapidjson
rapidjson是一个C++库,用于解析和生成JSON数据格式。它是一个高性能、轻量级的库,由于使用了DOM和SAX两种解析方式,可以满足不同场景的需求。rapidjson的特点包括:支持Unicode、跨平台、简单易用、解析速度快等。它可以在很多领域得到广泛应用,如网络通信、数据存储和数据交换等。
解析的工具有:
RapidJSON
JSON for Modern C++
Boost.PropertyTree
C++ REST SDK
QtJson
nlohmann/json
Jansson
cJSON
0创建一个json数据
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include "iostream"
using namespace rapidjson;
int main() {
// // JSON字符串
// const char* json = R"({"name":"John","age":30,"isStudent":true})";
// // 解析JSON字符串
// Document document;
// document.Parse(json);
// // 获取字段
// const char* name = document["name"].GetString();
// int age = document["age"].GetInt();
// bool isStudent = document["isStudent"].GetBool();
//
// // 输出结果
// printf("name: %s\nage: %d\nisStudent: %s\n", name, age, isStudent ? "true" : "false");
//
// return 0;
rapidjson::Document document; // 创建一个JSON文档对象
document.SetObject(); // 将该文档对象设置为一个JSON对象
rapidjson::Document::AllocatorType& allocator = document.GetAllocator(); // 获取分配器
rapidjson::Value hobbies(rapidjson::kObjectType); // 创建一个空对象
// 向对象中添加键值对
hobbies.AddMember("name", "reading", allocator);
hobbies.AddMember("level", "advanced", allocator);
// 将对象添加到JSON对象中
document.AddMember("hobbies", hobbies, allocator);
StringBuffer buffer; // 创建一个字符串缓冲区
Writer<StringBuffer> writer(buffer); // 创建一个JSON写入器
document.Accept(writer); // 将JSON对象序列化为字符串并写入缓冲区
// 输出结果
std::cout<< buffer.GetString() << std::endl;
}
创建一个json格式的数组数据,填入数据
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
using namespace rapidjson;
int main() {
Document document; // 创建一个JSON文档对象
document.SetObject(); // 将该文档对象设置为一个JSON对象
Document::AllocatorType& allocator = document.GetAllocator(); // 获取分配器
Value hobbies(kArrayType); // 创建一个空数组
// 向数组中添加多个对象
Value reading(kObjectType);
reading.AddMember("name", "reading", allocator);
reading.AddMember("level", "advanced", allocator);
hobbies.PushBack(reading, allocator);
Value swimming(kObjectType);
swimming.AddMember("name", "swimming", allocator);
swimming.AddMember("level", "beginner", allocator);
hobbies.PushBack(swimming, allocator);
// 将数组添加到JSON对象中
document.AddMember("hobbies", hobbies, allocator);
StringBuffer buffer; // 创建一个字符串缓冲区
Writer<StringBuffer> writer(buffer); // 创建一个JSON写入器
document.Accept(writer); // 将JSON对象序列化为字符串并写入缓冲区
// 输出结果
std::cout << buffer.GetString() << std::endl;
return 0;
}
个人记录
3 创建后再读出来
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
using namespace rapidjson;
int main() {
Document document; // 创建一个JSON文档对象
document.SetObject(); // 将该文档对象设置为一个JSON对象
Document::AllocatorType &allocator = document.GetAllocator(); // 获取分配器
Value hobbies(kArrayType); // 创建一个空数组
// 向数组中添加多个对象
Value reading(kObjectType);
reading.AddMember("name", "reading", allocator);
reading.AddMember("level", "advanced", allocator);
hobbies.PushBack(reading, allocator);
// 将数组添加到JSON对象中
document.AddMember("hobbies", hobbies, allocator);
StringBuffer buffer; // 创建一个字符串缓冲区
Writer<StringBuffer> writer(buffer); // 创建一个JSON写入器
document.Accept(writer); // 将JSON对象序列化为字符串并写入缓冲区
//读出来
Document document1;
document1.Parse(buffer.GetString());
//这一行代码是获取了名为"hobbies"的成员的值,它在之前的代码中被添加到了document对象中
//hobbies1是一个引用,指向document对象中名为"hobbies"的成员的值,它是一个包含多个对象的数组。
//这里使用const修饰表示hobbies1是一个只读的引用,即不能通过hobbies1修改document对象中的值。
const Value &hobbies1 = document["hobbies"];
//获取json数组的个数
for (SizeType i = 0; i < hobbies1.Size(); i++) {
const Value &hobby = hobbies1[i];
const char *name = hobby["name"].GetString();
const char *level = hobby["level"].GetString();
std::cout << "Hobby " << i << ": name = " << name << ", level = " << level << std::endl;
}
return 0;
}