首发于 技术开发环境
C++使用rapidjson读写JSON

C++使用rapidjson读写JSON

rapidjson 是一个用于解析和生成 JSON 数据的快速、轻量级的 C++ 库。它提供了一组简单易用的 API,用于解析 JSON 文本并构建 JSON 对象,以及将 JSON 对象转换为字符串形式。

它具有如下特点

  1. 高性能 :RapidJSON 在处理 JSON 数据时具有出色的性能。它使用了一些优化技术,如内存池分配、移动语义和零拷贝,以提高解析和生成的速度。
  2. 轻量级 :RapidJSON 以一个单头文件的形式提供,不需要依赖其他库或复杂的安装过程。这使得它非常易于集成到项目中,并且具有较小的二进制大小和低资源消耗。
  3. 符合JSON标准 :RapidJSON 实现了 JSON 标准规范(RFC 8259)并支持所有常用的 JSON 功能,包括对象、数组、字符串、数字、布尔值和 null 值等。
  4. 跨平台 :RapidJSON 可以在多个平台上运行,包括 Windows、Linux、macOS 和嵌入式系统等。

读取和修改json

如果要读取和需改json,可以构造Document对象,把json字符串传给

Document对象,然后使用hasMember查看某个key是否存在。可以使用AddMember函数添加成员,使用RemoveMember删除成员,可以使用SetString等方法修改数据成员的值。

#include "rapidjson/rapidjson.h"
#include "rapidjson/document.h"
#include <iostream>
using namespace rapidjson;
int main(int argc, char **argv)
    const char *json = "{\"key\":\"value\",\"flag\":true}";
    Document document;
    document.Parse(json);
    // 查询
    assert(document.HasMember("key"));
    assert(document["key"].IsString());
    std::cout << document["key"].GetString() << std::endl;;
    // 修改
    document["key"].SetString("hello world");
    std::cout << document["key"].GetString() << std::endl;
    // 添加
    Value val;
    val.SetString("string", document.GetAllocator());     
    document.AddMember("val", val, document.GetAllocator()); 
    std::cout << document["val"].GetString() << std::endl;
    document.RemoveMember("key");
    std::cout << document.HasMember("key") << std::endl;
    return 0;

生成json

如果要生成json,可以使用Writer和StingBuffer来实现。

startObject和endObject分别表示buffer对象开始和结束,中间的代码可以填充key和value,value可以支持Array,Number,String,bool等,rapidjson实现了RFC 8259 JSON标准规范。

#include "rapidjson/stringbuffer.h"
#include "rapidjson/writer.h"
#include <iostream>
using namespace rapidjson;
int main(int argc, char **argv)
    //生成json
    StringBuffer buffer;
    Writer<StringBuffer> writer(buffer);
    writer.StartObject();
    //key为hello
    writer.Key("hello");
    //value为数组,使用StartArray和EndArray函数
    writer.StartArray();
    writer.String("world");
    writer.String("json");
    writer.EndArray();