概述
应用 rapidjson
生成 json
并对其进行解析。
罕用函数
AddMember
- 性能:往对象中增加一个键值对。
- 函数原型
GenericValue& rapidjson::GenericValue< Encoding, Allocator >::AddMember( GenericValue< Encoding, Allocator > & name, GenericValue< Encoding, Allocator > & value, Allocator & allocator )
函数参数
- name 是键的名称
- value 是对应键的值
- allocator 用来分配内存的分配器,必须与后面应用的雷同。
SetString
- 性能:将此值设置为字符串,且复制原字符串。
- 函数原型
GenericValue& rapidjson::GenericValue< Encoding, Allocator >::SetString(const Ch * s,SizeType length,Allocator & allocator )
函数参数
- s 是原字符串
- length 是原字符串的长度,包含前面的空字符
- allocator 分配器
代码
#include <iostream>#include <string>#include <fstream>#include <windows.h>#include "rapidjson/prettywriter.h"#include "rapidjson/document.h"#include "rapidjson/istreamwrapper.h"using namespace std;using namespace rapidjson;//-----------------------------------------------------------------------------void AddBasicType(Document &d, Document::AllocatorType & allocator){ d.AddMember("digit", 3, allocator); // 增加整型数据 d.AddMember("height", 170.5, allocator); // 增加浮点类型 d.AddMember("subject1", "math", allocator); // 增加字符串类型,常量形式 string strSubject = "English"; Value valueSubject(kStringType); valueSubject.SetString(strSubject.c_str(), strSubject.size(), allocator); if (!valueSubject.IsNull()) { d.AddMember("subject2", valueSubject, allocator); // 增加字符串类型,变量形式,不能间接对变量进行增加,类型不对 }}//-----------------------------------------------------------------------------void AddObjectType(Document &d, Document::AllocatorType & allocator){ Value valueObject(kObjectType); valueObject.AddMember("sex", "male", allocator); valueObject.AddMember("weight", 95, allocator); d.AddMember("info", valueObject, allocator);}//-----------------------------------------------------------------------------void AddStringArrayType(Document &d, Document::AllocatorType & allocator){ Value valueStr(kStringType); // 单个字符串 Value valueStrArray(kArrayType); // 字符串数组 string strExtraSubject1 = "计算机"; string strExtraSubject2 = "音乐"; string strExtraSubject3 = "体育"; valueStr.SetString(strExtraSubject1.c_str(), strExtraSubject1.size(), allocator); valueStrArray.PushBack(valueStr, allocator); valueStr.SetString(strExtraSubject2.c_str(), strExtraSubject2.size(), allocator); valueStrArray.PushBack(valueStr, allocator); valueStr.SetString(strExtraSubject3.c_str(), strExtraSubject3.size(), allocator); valueStrArray.PushBack(valueStr, allocator); d.AddMember("extraSubject", valueStrArray, allocator);}//-----------------------------------------------------------------------------void AddObjectArrayType(Document &d, Document::AllocatorType & allocator){ Value valueObjectArray(kArrayType); for (int i = 0; i < 3; i++) { Value valueSingleObject(kObjectType); valueSingleObject.AddMember("score", i * 40, allocator); if (i == 0) { valueSingleObject.AddMember("difficulty", "hard", allocator); } else if (i == 1) { valueSingleObject.AddMember("difficulty", "abnormal", allocator); } else { valueSingleObject.AddMember("difficulty", "easy", allocator); } valueObjectArray.PushBack(valueSingleObject, allocator); } d.AddMember("subjectInfo", valueObjectArray, allocator);}//-----------------------------------------------------------------------------void ParseBasicType(Document &d, string jsonData){ if (!d.Parse(jsonData.data()).HasParseError()) { // 解析整型 if (d.HasMember("digit") && d["digit"].IsInt()) { cout << "digit = " << d["digit"].GetInt() << endl; } // 解析浮点型 if (d.HasMember("height") && d["height"].IsDouble()) { cout << "height = " << d["height"].GetDouble() << endl; } // 解析字符串类型 if (d.HasMember("subject1") && d["subject1"].IsString()) { cout << "subject1 = " << d["subject1"].GetString() << endl; } if (d.HasMember("subject2") && d["subject1"].IsString()) { cout << "subject2 = " << d["subject2"].GetString() << endl; } }}//-----------------------------------------------------------------------------void ParseObjectType(Document &d, string jsonData){ if (d.HasMember("info") && d["info"].IsObject()) { const Value& resInfo = d["info"]; // 获取对象 if (resInfo.HasMember("sex") && resInfo["sex"].IsString()) { cout << "resInfo.sex = " << resInfo["sex"].GetString() << endl; } if (resInfo.HasMember("weight") && resInfo["weight"].IsInt()) { cout << "resInfo.weight = " << resInfo["weight"].GetInt() << endl; } }}//-----------------------------------------------------------------------------void ParseStringArrayType(Document &d, string jsonData){ if (d.HasMember("extraSubject") && d["extraSubject"].IsArray()) { const Value& valueStrArray = d["extraSubject"]; size_t len = valueStrArray.Size(); // 获取数组长度 for (size_t i = 0; i < len; i++) { cout << "extraSubject[" << i << "] = " << valueStrArray[i].GetString() << endl; } }}//-----------------------------------------------------------------------------void ParseObjectArrayType(Document &d, string jsonData){ if (d.HasMember("subjectInfo") && d["subjectInfo"].IsArray()) { const Value& valueObjectArray = d["subjectInfo"]; // 获取对象数组 size_t len = valueObjectArray.Size(); for (size_t i = 0; i < len; i++) { const Value& object = valueObjectArray[i]; // 每一个元素都是一个对象 if (object.IsObject()) { cout << "subjectInfo[" << i << "]: "; if (object.HasMember("score") && object["score"].IsInt()) { cout << "score = " << object["score"].GetInt(); } if (object.HasMember("difficulty") && object["difficulty"].IsString()) { cout << " difficulty = " << object["difficulty"].GetString(); } } cout << endl; } }}//-----------------------------------------------------------------------------int main(){ Document d; d.SetObject(); wstring wsValue; Document::AllocatorType &allocator = d.GetAllocator(); // 获取分配器 AddBasicType(d, allocator); // 增加根本类型 AddObjectType(d, allocator); // 增加对象类型,对象中有根本数据类型 AddStringArrayType(d, allocator); // 增加字符串数组类型,数组中的每一个元素是一个字符串 AddObjectArrayType(d, allocator); // 增加对象数组类型,数组中的每一个元素是一个对象 // StringBuffer是一个简略的输入流。它调配一个内存缓冲区,供写入整个JSON。 // 可应用GetString()来获取该缓冲区。 StringBuffer strBuf; Writer<StringBuffer> writer(strBuf); d.Accept(writer); string jsonData = strBuf.GetString(); cout << jsonData << endl << endl; ParseBasicType(d, jsonData); // 解析根本类型 ParseObjectType(d, jsonData); // 解析对象类型 ParseStringArrayType(d, jsonData); // 解析字符串数组类型 ParseObjectArrayType(d, jsonData); // 解析对象数组类型}
生成的 json 数据
{ "digit": 3, "height": 170.5, "subject1": "math", "subject2": "English", "info": { "sex": "male", "weight": 95 }, "extraSubject": [ "计算机", "音乐", "体育" ], "subjectInfo": [ { "score": 0, "difficulty": "hard" }, { "score": 40, "difficulty": "abnormal" }, { "score": 80, "difficulty": "easy" } ]}
参考资料
- RapidJSON 文档
- rapidjson库的根本应用