RapidJson的使用

▼魔方 西西 提交于 2020-01-19 17:34:57

rapidJson的使用

写Json:创建一个简单的json结构

方式一:使用rapidjson
	#define JSON_KEY_NAME_CONTENT "body"
	#define JSON_KEY_NAME_DATATYPE "type"
	#define JSON_KEY_REPORT_NAME_ACTIONRESULT "ActionRes"
	#define JSON_DATA_TYPE_WEAK_PASSWORD_OPTION_CHANGE "reportWeakPasswordOptionChange"

	rapidjson::StringBuffer reportBuff;
	rapidjson::Writer<rapidjson::StringBuffer> reportwriter(reportBuff);
	reportwriter.StartObject();
	reportwriter.Key(JSON_KEY_NAME_CONTENT);
	reportwriter.StartArray();
	reportwriter.StartObject();
	reportwriter.Key(JSON_KEY_REPORT_NAME_ACTIONRESULT);
	reportwriter.Int(ret);
	reportwriter.EndObject();
	reportwriter.EndArray();
	reportwriter.Key(JSON_KEY_NAME_DATATYPE);
	reportwriter.String(JSON_DATA_TYPE_WEAK_PASSWORD_OPTION_CHANGE);
	reportwriter.EndObject();
	std::string jsonstring = reportBuff.GetString()//改部分是将json转换为char *;

最后构建的结果
一个object
一个jsonobject中有两个对象,body为数组,type为string。
注意StartObject和EndObject,以及StartArray和EndArray需要成对出现。

方式二:使用AddMember增加元素
		rapidjson::Document jsonDoc;    //生成一个dom元素Document
		rapidjson::Document::AllocatorType &allocator = jsonDoc.GetAllocator(); //获取分配器
		jsonDoc.SetObject();    //将当前的Document设置为一个object,也就是说,整个Document是一个Object类型的dom元素
		jsonDoc.AddMember("ReplyTo", rapidjson::StringRef("test string"), allocator);
		jsonDoc.AddMember("Body", rapidjson::StringRef(""), allocator);
		int s = 10;
		jsonDoc.AddMember("Score",s,allocator);
		rapidjson::StringBuffer strBuf;
		rapidjson::Writer<rapidjson::StringBuffer> writer(strBuf);
		jsonDoc.Accept(writer);
		std::string data = std::string(strBuf.GetString());

这是从别的地方抄过来的一个例子,用来添加数组

	rapidjson::Value object(rapidjson::kObjectType); // 创建对象
	bject.AddMember("int", 1, allocator);         // 添加 "int" : 1
    object.AddMember("double", 1.1, allocator);    // 添加 "double" : 1.1
    object.AddMember("hello", "world", allocator); // 添加 "hello" : "world"
    
    //[4.2] 往json数组中添加数据:值
    rapidjson::Value array(rapidjson::kArrayType); // 创建数组
    rapidjson::Value str(rapidjson::kStringType);  // 字符串
    rapidjson::Value obj(rapidjson::kObjectType);  // 对象
    str.SetString("hello"); // 设置str的值
    obj.AddMember("name", "alice", allocator);
    obj.AddMember("age", 23, allocator);

    array.PushBack(123, allocator);   // 添加数字
    array.PushBack("888", allocator); // 添加字符串,方式一
    array.PushBack(str, allocator);   // 添加字符串,方式二
    array.PushBack(obj, allocator);   // 添加对象
    //[4.3] 往对象格式的json文件中添加数据
    d.AddMember("hello", "world", allocator);
    d.AddMember("object", object, allocator);
    d.AddMember("array", array, allocator);

在这里插入图片描述

读Json

Json数据格式
在这里插入图片描述
数据分析:moudleList是一个json数组,其中有四个object,每个object中有两个元素

void HandleJsonData(std::string &data){
	std::string stringType = "";
	rapidjson::Document doc;
	doc.Parse(data.c_str());
	if (doc.HasParseError())  
	{
		int ret1 = doc.HasParseError();
		return false;  
	}
	rapidjson::Value &module = doc["moudleList"];
	if (module.IsArray())
	{
		for (int i =0;i<module.Size();i++)
		{
			rapidjson::Value &reportdata = module[i]["reportData"];
			if (reportdata.IsArray())
			{
				std::string tmp = reportdata[0].GetString();

				rapidjson::Document datajson;
				if (datajson.Parse(tmp.c_str()).HasParseError())  
				{
					locallog.WriteLogAndConsole(LOG_DEBUG,"[%s] doc parse error  \r\n",__FUNCTION__);
					return false;  
				}
				if(doc.HasMember("type")){		
					stringType = doc["type"].GetString();
				}else{
					return false;
				}
				rapidjson::Value &body = doc["body"];
				if (body.IsArray())
				{
					body[0]["ActionRes"].GetInt();
				}
			}
		}
}

参考文章:
1、Json数据操作

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!