备注:本文展示一个使用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":"某街道"}}