Rapidjson简介:C++11模板库方式实现的json解析库
Rapidjson文档:http://rapidjson.org/zh-cn/index.html
以如下json为例,使用rapidjson解析
{ "data": { "security_token": "CAIS+QJ1q6Ft5B2yfSj...Hvo2LHm", "access_key_id": "STS.NTAgDURZo3op8zMRrfYvPG6yF", "access_key_secret": "HgeVRTDRH2TpKSDibH87wE2JyfXcJiDP1n3DagMTkBJB", "expiration": 1599035693, "resources": [ { "path": "dog-test/9062e25d-86c0-46d2-a2e5-7c003e461118/pictures/", "endpoint": "https://oss-cn-shenzhen.aliyuncs.com" } ] } }
以上json串包含:Object,Array,Key-Value,嵌套Object,嵌套Array等基本结构。
解析代码如下:
#include "rapidjson/document.h" // 解析OSS STS response中的json串 // pStrRespData为待解析json串 bool parse_osssts_json_data(myyk::SOSSInfo &struSTSResponse, string *pStrRespData) { struSTSResponse.result = false; rapidjson::Document doc; doc.Parse((*pStrRespData).c_str()); if(!doc.IsObject()) { LogError(string("Authorization response format isn't json format: ") + *pStrRespData); return false; } // 鉴权成功 if(doc.HasMember("data")) { rapidjson::Document::Object dataObj = doc["data"].GetObject(); struSTSResponse.mStrSecurityToken = dataObj["security_token"].GetString(); struSTSResponse.mStrAccessKeyId = dataObj["access_key_id"].GetString(); struSTSResponse.mStrAccessKeySecret = dataObj["access_key_secret"].GetString(); struSTSResponse.expiresTime = dataObj["expiration"].GetInt64(); // 授权到期时间点 rapidjson::Document::Array array = dataObj["resources"].GetArray(); // json array type if(array.Size() < 1) { LogInfo("OSS STS response json parse failed, 'resources' array size < 1"); return false; } rapidjson::Document::Object resObj = array[0].GetObject(); string path = resObj["path"].GetString(); // <bucketName>/<savePath>, aiot-rcb/9062e25d-86c0-46d2-a2e5-7c003e461118/pictures/ struSTSResponse.mStrEndpoint = resObj["endpoint"].GetString(); // endPoint, https://oss-cn-shenzhen.aliyuncs.com bool bRet = [&]()->bool { auto index = path.find_first_of('/'); if( string::npos == index ){ return false; } struSTSResponse.mStrBucketName = path.substr(0, index); struSTSResponse.mOSSSavePath = path.substr(index+1); return true; }(); if(!bRet) { LogError("OSS STS response json parse failed, 'bucket name' not found"); return false; } LogInfo("OSS STS response json parse success."); struSTSResponse.result = true; return true; } return false; }