使用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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值