對比過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;
}