C++使用RapidJson的demo

备注:本文展示一个使用RapidJson的简单示例,仅供参考,这是示例代码,非常简略,只是为了初学者方便学习使用。

本示例使用CLion创建工程,直接在工程代码中引入RapidJson,将其放在本工程的中

1,目录结构

在这里插入图片描述
RapidJson所有代码都在rapdijson目录中

2,CMakeLists.txt文件

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(rapidjsondemo)

set(CMAKE_CXX_STANDARD 11)


SET(PROJECT_ROOT_PATH ".")
INCLUDE_DIRECTORIES("${PROJECT_ROOT_PATH}/rapidjson/")
#INCLUDE_DIRECTORIES("${PROJECT_ROOT_PATH}/src/")


#target_link_libraries(hellowrold curl) //Cannot specify link libraries for target "hellowrold" which is not built by this project.

add_executable(rapidjsondemo main.cpp)

3,main.cpp文件

#include <iostream>
#include "rapidjson/document.h"
#include <vector>
#include "rapidjson/stringbuffer.h"
#include "rapidjson/writer.h"

using namespace std;
using namespace rapidjson;

// 教程:http://rapidjson.org/zh-cn/md_doc_tutorial_8zh-cn.html

int main() {
    // json字符串
    string jsonStr = "{\"name\": \"张三\", \"age\": 18}";

    // 转成json对象
    char* json = (char*)jsonStr.c_str();
    Document document;
    document.Parse(json);
    cout << "name " << document["name"].GetString() << ", age " << document["age"].GetInt() <<  endl;
    
    // 添加字符串值到已有json中
    Value str;
    str = "male";
    document.AddMember("gender", str, document.GetAllocator());// 参数:key、value

    // 添加double节点到已有json中
    Value doubleVal;
    doubleVal =  188.8;
    document.AddMember("height", doubleVal, document.GetAllocator());

    cout << "gender " << document["gender"].GetString() << ",height " << document["height"].GetDouble() <<  endl;

    // 添加数组
    Value arr(kArrayType);
    Document::AllocatorType& allocator = document.GetAllocator();
    vector<string> vec = {"cpp", "java", "python", "go", "c"};
    for (int i = 0; i < 5; i++) {
        // 这里很奇怪的是直接放vec[i]编译不通过,不得不转char*再转StringRef
        arr.PushBack(StringRef(vec[i].c_str()), allocator);   // 可能需要调用 realloc() 所以需要 allocator
    }
    // arr.PushBack("read", allocator).PushBack("code", allocator); // 另一种组装数组的方式
    document.AddMember("languages", arr, allocator);
    
    cout << "languages:" << endl;
    // 使用引用来连续访问,方便之余还更高效。
    const Value& a = document["languages"];
    assert(a.IsArray());// 所有类型的值都可以先进行判断
    for (SizeType i = 0; i < a.Size(); i++) {
        cout << a[i].GetString() << endl;
    }


    // 添加一个json子对象
    Value addressSubObj(kObjectType);
    addressSubObj.AddMember("city", "北京", allocator);
    addressSubObj.AddMember("district", "海淀区2", allocator);
    addressSubObj.AddMember("street", "某街道", allocator);
    document.AddMember("address", addressSubObj, allocator);

    cout << "address is " << document["address"]["city"].GetString()
        << " district is " << document["address"]["district"].GetString()
        << " street is " << document["address"]["street"].GetString() << endl;


    // 转成字符串
    StringBuffer strBuffer;  
    Writer<StringBuffer> writer(strBuffer);  
    document.Accept(writer);  
    cout << strBuffer.GetString() << endl;

    return 0;
}

4, 执行结果

cmake .
make
./rapidjsondemo

xxx-MacBook-Pro RapidJsonCppDemo % cmake .
-- Configuring done
-- Generating done
-- Build files have been written to: xxx/CLionProjects/RapidJsonCppDemo
xxx-MacBook-Pro RapidJsonCppDemo % make
Consolidate compiler generated dependencies of target rapidjsondemo
[ 50%] Building CXX object CMakeFiles/rapidjsondemo.dir/main.cpp.o
[100%] Linking CXX executable rapidjsondemo
[100%] Built target rapidjsondemo
xxx-MacBook-Pro RapidJsonCppDemo % ./rapidjsondemo 
name 张三, age 18
gender male,height 188.8
languages:
cpp
java
python
go
c
address is 北京 district is 海淀区2 street is 某街道
{"name":"张三","age":18,"gender":"male","height":188.8,"languages":["cpp","java","python","go","c"],"address":{"city":"北京","district":"海淀区2","street":"某街道"}}


版权声明:本文为russle原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。