Answer:rapidjson 是一个 C++ 的 JSON 解析器及生成器 。rapidjson不依赖第三方库,而且只包含头文件,使用方便简单。
Answer:rapidjson 的安装很简单,因为只包含头文件可用,且不依赖第三方库因此。我们只需把头文件下载下来就可以用。文件下载地址:https://github.com/Tencent/rapidjson.git。rapidjson的官网资料:http://rapidjson.org/zh-cn/。
下载下来后,打开有一个include目录,这就是我们需要的东西,然后把这个东西直接拷贝到我们的工程路径,如果提示有错,先确定拷贝过来后是否是否连接了。连接方法:ecilpse->Roject->Properties->C/C++ General->Paths and Symbols->includes.十分简单。
有的时候,需要的json格式是十分复杂的,如下所示:
{
"name":"jack",//常规的
"age":18,
"sub":["a","b"],//value是数组
"elp":[ {"a":"A","b":"B"},//value是一个数组且里面每个元素又是一个json格式
{"c":"C","d":"D"},
]
}
std::string build_json_msg(){
rapidjson::Document doc;//生成DOM元素
doc.SetObject();
rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();//生成一个分配器
//构建键值对
doc.AddMember("name","jack",allocator);
doc.AddMember("age",18,allocator);
//====构建数组元素====["1","2"]
rapidjson::Value array_sub(rapidjson::kArrayType);//创建一个数组类型对象
array_sub.PushBack("a",allocator);
array_sub.PushBack("b",allocator);
//================
doc.AddMember("sub",array_sub,allocator);
//====构建数组object===[{"1":2,},{}]
rapidjson::Value array_json(rapidjson::kArrayType);
rapidjson::Value obj(rapidjson::kObjectType);//每一个数组里面是一个json格式
obj.AddMember("a","A",allocator);
obj.AddMember("b","B",allocator);
array_json.PushBack(obj,allocator);
rapidjson::Value obj1(rapidjson::kObjectType);//每一个数组里面是一个json格式
obj1.AddMember("c","C",allocator);
obj1.AddMember("d","D",allocator);
array_json.PushBack(obj1,allocator);
array_json.PushBack(obj1,allocator);
doc.AddMember("elp",array_json,allocator);
rapidjson::StringBuffer s;
rapidjson::Writer writer(s);
doc.Accept(writer);
return std::string(s.GetString());
}
在生成的时候我们需要几个十分重要的对象,Document、AllocatorType。刚开始的三行代码是比较固定的,先申明一个doc和一个分配器。
rapidjson::Document doc;//生成DOM元素
doc.SetObject();
rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();//生成一个分配器
我们添加json元素主要通过doc.AddMember(key,value,分配器)的形式来生成。如果json格式很简单,那么代码也很简单,如下:
doc.AddMember("name","jack",allocator);
doc.AddMember("age",18,allocator);
但是,如果涉及到数组。就需要注意一下。首先,我们需要创建一个数组类型的对象。然后把数组里面的内容PushBack进去。最后同样通过doc.AddMember()添加进去。但是value却变成了array_sub.说明AddMember()的第二个参数,不仅可以是值还可以是对象。
rapidjson::Value array_sub(rapidjson::kArrayType);//创建一个数组类型对象
array_sub.PushBack("a",allocator);
array_sub.PushBack("b",allocator);
//================
doc.AddMember("sub",array_sub,allocator);
同样,如果数组里面是json串,该怎么办呢?其实写法按着上面的逻辑来,看上面的代码,只不过把‘a’换成object类型的。具体写法如下:
//====构建数组object===[{"1":2,},{}]
rapidjson::Value array_json(rapidjson::kArrayType);
rapidjson::Value obj(rapidjson::kObjectType);//每一个数组里面是一个json格式
obj.AddMember("a","A",allocator);
obj.AddMember("b","B",allocator);
array_json.PushBack(obj,allocator);
rapidjson::Value obj1(rapidjson::kObjectType);//每一个数组里面是一个json格式
obj1.AddMember("c","C",allocator);
obj1.AddMember("d","D",allocator);
array_json.PushBack(obj1,allocator);
array_json.PushBack(obj1,allocator);
doc.AddMember("elp",array_json,allocator);