对比过boost解析和组装json,rapidjson的解析和组装对系统资源的占用率要小很多,具体原因不清楚。在解析配置文件等很小的json字符串时,boost解析速度还是非常快,但是对于频繁解析和组装来说,boost显得有些心有余而力不足,rapidjson解析和组装显得非常快。
rapidjson库的介绍可以在这个网址上查看:http://rapidjson.org/zh-cn/
rapidjson库的下载地址可以在git上下载:https://github.com/miloyip/rapidjson
由于rapidjson库只有头文件,所以下载下来后,不需要编译,直接放在项目中,添加头文件后就可以使用,这里不详细记录。
由于官方的实例代码不太容易看懂,调用层级很深,且加上了各种兼容判断等,所以下面记录一个简单的示例代码,为自己方便,也为需要的伙伴准备。
样例json
假如json的字符串为下面的格式:
{
"name": "zhangsan",
"age": 20,
"links": [
{
"name": "Google",
"url": "http://www.google.com"
},
{
"name": "Baidu",
"url": "http://www.baidu.com"
},
{
"name": "SoSo",
"url": "http://www.SoSo.com"
}
]
}
解析json
rapidjson::Document doc;
doc.Parse(str.c_str());
if (doc.HasParseError()) {}
else {
if (doc.HasMember("name") && (!doc["name"].IsNull())) {
std::cout<<"name:"<<doc["name"].GetString() << std::endl;
}
if (doc.HasMember("age") && (!doc["age"].IsNull())) {
std::cout << "age:" << doc["age"].GetInt() << std::endl;
}
if (doc.HasMember("links") && (!doc["links"].IsNull())) {
rapidjson::Value& items = doc["links"];
if (items.IsArray()) {
SizeType cout = items.Capacity();
if (cout == 0) {}
else {
for (SizeType i = 0; i < cout; ++i) {
rapidjson::Value& val = items[i];
if (val.HasMember("name") && (!val["name"].IsNull())) {
std::cout << "name:" << val["name"].GetString() << std::endl;
}
if (val.HasMember("url") && (!val["url"].IsNull())) {
std::cout << "url:" << val["url"].GetString() << std::endl;
}
}
}
}
}
}
组装json
StringBuffer json;
PrettyWriter<StringBuffer> writer(json);
try {
writer.StartObject();
writer.String("name");
writer.String("zhangsan");
writer.String("age");
writer.Int(20);
writer.String("links");
writer.StartArray();
writer.StartObject();
writer.String("name");
writer.String("Google");
writer.String("url");
writer.String("http://www.google.com");
writer.EndObject();
writer.StartObject();
writer.String("name");
writer.String("Baidu");
writer.String("url");
writer.String("http://www.google.com");
writer.EndObject();
writer.StartObject();
writer.String("name");
writer.String("SoSo");
writer.String("url");
writer.String("http://www.google.com");
writer.EndObject();
writer.EndArray();
writer.EndObject();
}
catch (...) {}
完整示例代码
#include <iostream>
#include "rapidjson\prettywriter.h"
#include "rapidjson\document.h"
using namespace rapidjson;
std::string test1()
{
StringBuffer json;
PrettyWriter<StringBuffer> writer(json);
try {
writer.StartObject();
writer.String("name");
writer.String("zhangsan");
writer.String("age");
writer.Int(20);
writer.String("links");
writer.StartArray();
writer.StartObject();
writer.String("name");
writer.String("Google");
writer.String("url");
writer.String("http://www.google.com");
writer.EndObject();
writer.StartObject();
writer.String("name");
writer.String("Baidu");
writer.String("url");
writer.String("http://www.google.com");
writer.EndObject();
writer.StartObject();
writer.String("name");
writer.String("SoSo");
writer.String("url");
writer.String("http://www.google.com");
writer.EndObject();
writer.EndArray();
writer.EndObject();
}
catch (...) {}
std::string str = json.GetString();
// std::cout << str << std::endl;
return str;
}
void test2(std::string str)
{
rapidjson::Document doc;
doc.Parse(str.c_str());
if (doc.HasParseError()) {}
else {
if (doc.HasMember("name") && (!doc["name"].IsNull())) {
std::cout<<"name:"<<doc["name"].GetString() << std::endl;
}
if (doc.HasMember("age") && (!doc["age"].IsNull())) {
std::cout << "age:" << doc["age"].GetInt() << std::endl;
}
if (doc.HasMember("links") && (!doc["links"].IsNull())) {
rapidjson::Value& items = doc["links"];
if (items.IsArray()) {
SizeType cout = items.Capacity();
if (cout == 0) {}
else {
for (SizeType i = 0; i < cout; ++i) {
rapidjson::Value& val = items[i];
if (val.HasMember("name") && (!val["name"].IsNull())) {
std::cout << "name:" << val["name"].GetString() << std::endl;
}
if (val.HasMember("url") && (!val["url"].IsNull())) {
std::cout << "url:" << val["url"].GetString() << std::endl;
}
}
}
}
}
}
}
int main()
{
test2(test1());
system("pause");
return 0;
}