天天看點

使用rapidjson解析群組裝json

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