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"
        }
      
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐