rapidjson 基本用法¶
项目地址:rapidjson
RapidJSON是一个用C++编写的高性能JSON解析和生成库,支持SAX和DOM两种API风格。它具有体积小、速度快、内存友好、支持Unicode等优点,广泛应用于各种C++项目中。
1. 核心特性¶
- 支持DOM和SAX两种API
- 高性能:性能可与
strlen()媲美,支持SSE2/SSE4.2加速 - 头文件-only:无需依赖外部库
- 内存高效:每个JSON值占用16字节(大部分平台)
- Unicode支持:支持UTF-8、UTF-16、UTF-32,支持转码和检测
2. 基本用法¶
2.1 解析JSON字符串为DOM¶
#include "rapidjson/document.h"
using namespace rapidjson;
const char* json = "{\"name\":\"John\",\"age\":30}";
Document d;
d.Parse(json);
2.2 访问和修改DOM¶
Value& name = d["name"];
std::cout << name.GetString() << std::endl; // 输出 John
// 修改值
d["age"].SetInt(31);
2.3 将DOM转为JSON字符串¶
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
d.Accept(writer);
std::cout << buffer.GetString() << std::endl;
3. DOM API详细用法¶
3.1 创建JSON对象¶
Document d;
d.SetObject();
Document::AllocatorType& allocator = d.GetAllocator();
d.AddMember("name", "Alice", allocator);
d.AddMember("age", 25, allocator);
3.2 遍历对象和数组¶
for (Value::ConstMemberIterator itr = d.MemberBegin(); itr != d.MemberEnd(); ++itr) {
std::cout << itr->name.GetString() << ": " << itr->value.GetInt() << std::endl;
}
3.3 复杂结构示例¶
Value arr(kArrayType);
arr.PushBack(1, allocator).PushBack(2, allocator).PushBack(3, allocator);
d.AddMember("numbers", arr, allocator);
4. SAX API用法¶
4.1 定义事件处理器¶
#include "rapidjson/reader.h"
class MyHandler : public rapidjson::BaseReaderHandler<> {
public:
bool StartObject() { /* 处理开始对象 */ return true; }
bool Key(const char* str, SizeType length, bool) { /* 处理键 */ return true; }
bool String(const char* str, SizeType length, bool) { /* 处理字符串值 */ return true; }
bool EndObject(SizeType memberCount) { /* 结束对象 */ return true; }
};
4.2 解析示例¶
rapidjson::Reader reader;
MyHandler handler;
const char* json = "{\"name\":\"Bob\"}";
StringStream ss(json);
reader.Parse(ss, handler);
5. 高级用法¶
5.1 使用JSON指针¶
5.2 使用JSON Schema验证¶
详见官方文档
5.3 处理UTF编码¶
RapidJSON支持UTF-8、UTF-16、UTF-32,自动检测和转码。