包含头文件
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/prettywriter.h"
#include "rapidjson/stringbuffer.h"
生成json字符串
int main()
{
rapidjson::Document doc; //获取Document对象
doc.SetObject(); //key-value 相当与map; doc.SetArray(); //数组型 相当与vector
rapidjson::Document::AllocatorType &allocator=doc.GetAllocator(); //获取分配器
doc.AddMember("name","名字",allocator);//给doc对象赋值
//添加数组数据
rapidjson::Value array(rapidjson::kArrayType);
for(int i=0;i<3;i++)
{
rapidjson::Value arrsub(rapidjson::kArrayType);
arrsub.PushBack(i, allocator);
//arrsub.PushBack(rapidjson::Value("aa", allocator).Move(), allocator);
arrsub.PushBack(rapidjson::Value("aa", std::strlen("aa"), allocator).Move(), allocator);
arrsub.PushBack(i+1.0, allocator);
array.PushBack(arrsub,allocator);
if(arrsub.IsNull())
{
std::cout<<"arrsub转移了"<<std::endl;
}
}
doc.AddMember("arr",array,allocator);
if(array.IsNull())
{
std::cout<<"arr转移了"<<std::endl;
}
//将doc对象的值写入字符串
rapidjson::StringBuffer buffer;
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer); //PrettyWriter是格式化的json
doc.Accept(writer);
std::cout<<buffer.GetString()<<std::endl;
buffer.Clear();
rapidjson::Writer<rapidjson::StringBuffer> writer2(buffer); //Writer则是换行空格压缩后的json
doc.Accept(writer2);
std::cout<<buffer.GetString()<<std::endl;
return 0;
}
输出结果
arrsub转移了
arrsub转移了
arrsub转移了
arr转移了
{
"name": "名字",
"arr": [
[
0,
"aa",
1.0
],
[
1,
"aa",
2.0
],
[
2,
"aa",
3.0
]
]
}
{"name":"名字","arr":[[0,"aa",1.0],[1,"aa",2.0],[2,"aa",3.0]]}
解析json字符串
struct subarr
{
std::string str;
int i;
double d;
//在C++11中std中有stoi、stod、stof、stol和stoll等函数
//分别是把字符串转化为int、double、float、long和long、long型。
//而数字转字符串则用to_string
std::string tostr()
{
std::string buf;
buf.append(std::to_string(i)).append(",")
.append(str).append(",")
.append(std::to_string(d));
return buf;
}
};
typedef std::shared_ptr<subarr> subarr_ptr;//shared_ptr要包含#include<memory>
typedef std::shared_ptr<std::vector<subarr_ptr>> sh_subarr_ptr;
struct docobj
{
std::string name;
std::vector<subarr_ptr> arr;
std::string tostr()
{
std::string buf;
buf.append("{")
.append("name:").append(name).append(",")
.append("arr:").append("[");
for(auto ptr:arr)
{
buf.append("[").append(ptr->tostr()).append("]");
}
buf.append("]")
.append("}");
return buf;
}
};
int main()
{
const char* json_str="{\"name\":\"名字\",\"arr\":[[0,\"aa\",1.0],[1,\"aa\",2.0],[2,\"aa\",3.0]]}";
rapidjson::Document document;
document.Parse(json_str);
if(document.HasParseError())
{
return 0;
}
docobj obj;
auto node_ptr = document.FindMember("name");
if(document.MemberEnd()==node_ptr)
{
return 0;
}
const rapidjson::Value& node = node_ptr->value;
if(node.IsString())
{
obj.name=node.GetString();
}
node_ptr = document.FindMember("arr");
if(document.MemberEnd()==node_ptr || !node_ptr->value.IsArray())
{
return 0;
}
const rapidjson::Value& nodes = document["arr"];
if(!nodes.IsArray())
{
return 0;
}
for(rapidjson::SizeType i = 0; i < nodes.Size(); ++i)
{
const rapidjson::Value& subnodes = nodes[i];
if(!subnodes.IsArray() || 3!=subnodes.Size())
{
continue;
}
subarr_ptr ptr(new subarr_ptr::element_type());
ptr->i=subnodes[0].GetInt();
ptr->str=subnodes[1].GetString();
ptr->d=subnodes[2].GetDouble();
obj.arr.push_back(ptr);
}
std::cout << obj.tostr() << std::endl;
return 0;
}
输出结果
{name:名字,arr:[[0,aa,1.000000][1,aa,2.000000][2,aa,3.000000]]}
浅拷贝与深拷贝
rapidjson::Document doc;
doc.SetObject();
auto& allocator = doc.GetAllocator();
char a[8]="aaaaa";
rapidjson::Value node;
node.SetArray();
for(int i=0;i<1;i++)
{
rapidjson::Value node1(rapidjson::kArrayType);
//浅拷贝
node1.PushBack(rapidjson::StringRef(a), allocator);
//深拷贝
node1.PushBack(rapidjson::Value(a, allocator).Move(), allocator);
node.PushBack(node1, allocator);
}
a[3]='b';
doc.AddMember("data",node,allocator);
rapidjson::StringBuffer sb;
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(sb);
doc.Accept(writer);
std::cout<<sb.GetString()<<std::endl;
输出结果:
{
"data": [
[
"aaaba",
"aaaaa"
]
]
}