轉載:
https://blog.csdn.net/qq849635649/article/details/52678822
#include "rapidjson/stringbuffer.h" #include "rapidjson/writer.h" #include <iostream> #include <string> using namespace std; void Serialize_1() { rapidjson::StringBuffer strBuf; rapidjson::Writer<rapidjson::StringBuffer> writer(strBuf); writer.StartObject(); //1. 整數類型 writer.Key("Int"); writer.Int(1); //2. 浮點類型 writer.Key("Double"); writer.Double(12.0000001); //3. 字符串類型 writer.Key("String"); writer.String("This is a string"); //4. 結構體類型 writer.Key("Object"); writer.StartObject(); writer.Key("name"); writer.String("qq849635649"); writer.Key("age"); writer.Int(25); writer.EndObject(); //5. 數組類型 //5.1 整型數組 writer.Key("IntArray"); writer.StartArray(); //順序寫入即可 writer.Int(10); writer.Int(20); writer.Int(30); writer.EndArray(); //5.2 浮點型數組 writer.Key("DoubleArray"); writer.StartArray(); for(int i = 1; i < 4; i++) { writer.Double(i * 1.0); } writer.EndArray(); //5.3 字符串數組 writer.Key("StringArray"); writer.StartArray(); writer.String("one"); writer.String("two"); writer.String("three"); writer.EndArray(); //5.4 混合型數組 //這說明了,一個json數組內容是不限制類型的 writer.Key("MixedArray"); writer.StartArray(); writer.String("one"); writer.Int(50); writer.Bool(false); writer.Double(12.005); writer.EndArray(); //5.5 結構體數組 writer.Key("People"); writer.StartArray(); for(int i = 0; i < 3; i++) { writer.StartObject(); writer.Key("name"); writer.String("qq849635649"); writer.Key("age"); writer.Int(i * 10); writer.Key("sex"); writer.Bool((i % 2) == 0); writer.EndObject(); } writer.EndArray(); writer.EndObject(); string data = strBuf.GetString(); cout << data << endl; } --------------------- 作者:奮斗-少年 來源:CSDN 原文:https://blog.csdn.net/qq849635649/article/details/52678822 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
解析:
void parse() { //創建解析對象 rapidjson::Document doc; //首先進行解析,沒有解析錯誤才能進行具體字段的解析 if(!doc.Parse(data.data()).HasParseError()) { //1. 解析整數 if(doc.HasMember("Int") && doc["Int"].IsInt()) { cout << "Int = " << doc["Int"].GetInt() << endl; } //2. 解析浮點型 if(doc.HasMember("Double") && doc["Double"].IsDouble()) { cout << "Double = " << doc["Double"].GetDouble() << endl; } //3. 解析字符串 if(doc.HasMember("String") && doc["String"].IsString()) { cout << "String = " << doc["String"].GetString() << endl; } //4. 解析結構體 if(doc.HasMember("Object") && doc["Object"].IsObject()) { const rapidjson::Value& object = doc["Object"]; if(object.HasMember("name") && object["name"].IsString()) { cout << "Object.name = " << object["name"].GetString() << endl; } if(object.HasMember("age") && object["age"].IsInt()) { cout << "Object.age = " << object["age"].GetInt() << endl; } } //5. 解析數組類型 //5.1 整型數組類型 if(doc.HasMember("IntArray") && doc["IntArray"].IsArray()) { //5.1.1 將字段轉換成為rapidjson::Value類型 const rapidjson::Value& array = doc["IntArray"]; //5.1.2 獲取數組長度 size_t len = array.Size(); //5.1.3 根據下標遍歷,注意將元素轉換為相應類型,即需要調用GetInt() for(size_t i = 0; i < len; i++) { cout << "IntArray[" << i << "] = " << array[i].GetInt() << endl; } } //5.2 浮點型數組類型 if(doc.HasMember("DoubleArray") && doc["DoubleArray"].IsArray()) { const rapidjson::Value& array = doc["DoubleArray"]; size_t len = array.Size(); for(size_t i = 0; i < len; i++) { //為防止類型不匹配,一般會添加類型校驗 if(array[i].IsDouble()) { cout << "DoubleArray[" << i << "] = " << array[i].GetDouble() << endl; } } } //5.3 字符串數組類型 if(doc.HasMember("StringArray") && doc["StringArray"].IsArray()) { const rapidjson::Value& array = doc["StringArray"]; size_t len = array.Size(); for(size_t i = 0; i < len; i++) { //為防止類型不匹配,一般會添加類型校驗 if(array[i].IsString()) { cout << "StringArray[" << i << "] = " << array[i].GetString() << endl; } } } //5.4 混合型 if(doc.HasMember("MixedArray") && doc["MixedArray"].IsArray()) { const rapidjson::Value& array = doc["MixedArray"]; size_t len = array.Size(); for(size_t i = 0; i < len; i++) { //為防止類型不匹配,一般會添加類型校驗 if(array[i].IsString()) { cout << "MixedArray[" << i << "] = " << array[i].GetString() << endl; } else if(array[i].IsBool()) { cout << "MixedArray[" << i << "] = " << array[i].GetBool() << endl; } else if(array[i].IsInt()) { cout << "MixedArray[" << i << "] = " << array[i].GetInt() << endl; } else if(array[i].IsDouble()) { cout << "MixedArray[" << i << "] = " << array[i].GetDouble() << endl; } } } //5.5 結構體數組類型 if(doc.HasMember("People") && doc["People"].IsArray()) { const rapidjson::Value& array = doc["People"]; size_t len = array.Size(); for(size_t i = 0; i < len; i++) { const rapidjson::Value& object = array[i]; //為防止類型不匹配,一般會添加類型校驗 if(object.IsObject()) { cout << "ObjectArray[" << i << "]: "; if(object.HasMember("name") && object["name"].IsString()) { cout << "name=" << object["name"].GetString(); } if(object.HasMember("age") && object["age"].IsInt()) { cout << ", age=" << object["age"].GetInt(); } if(object.HasMember("sex") && object["sex"].IsBool()) { cout << ", sex=" << (object["sex"].GetBool() ? "男" : "女") << endl; } } } } } /** * 最后注意:因為rapidjson不會做安全校驗,所以要自己做安全校驗,以int整型為例 * “if(object.HasMember("age") && object["age"].IsInt()) {}” * 這句校驗很重要,既要校驗有該子段,也要校驗類型正確,否則會引發程序崩潰 */ } --------------------- 作者:奮斗-少年 來源:CSDN 原文:https://blog.csdn.net/qq849635649/article/details/52678822 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
順便貼一下我自己的使用:
int Alg_VIR_application::saveAdnTransWhiteBoxTestInfo(sApplicationInput &applicationInput, sWhiteBoxTestInfo &whiteBoxTestInfo, std::string jsonTestInfo) { #ifdef SAVE_WHITE_BOX_TEST_INFO if (!applicationInput.paramWhiteBoxTestOpenFlag) return PROCESS_SUCCESS; std::vector<cv::Point> vecPtShift = applicationInput.vecPtShift; //將公共的信息從applicationInput中獲取並塞入至whiteBoxTestInfo中 whiteBoxTestInfo.recPlateNum = applicationInput.regPlateNum; whiteBoxTestInfo.objLocation = applicationInput.car_location_res.objLocation; whiteBoxTestInfo.vvPoliceManDetectionOutput = applicationInput.vvPoliceManDetectionOutput; int CountobjLoc = MIN(whiteBoxTestInfo.objLocation.size(), vecPtShift.size()); int CountPoliceManDetection = MIN(whiteBoxTestInfo.vvPoliceManDetectionOutput.size(), vecPtShift.size()); int CountTrifficLight = MIN(whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects.size(), vecPtShift.size()); //與違法類型相關的信息,在前面進行app內進行處理的時候已經塞值進去了,因此現在whiteBoxTestInfo中已經是全的值,可以進行json的轉換了 rapidjson::StringBuffer strBuf; rapidjson::Writer<rapidjson::StringBuffer> writer(strBuf); writer.StartObject(); //4. 結構體類型 writer.Key("recPlateNum"); writer.String(whiteBoxTestInfo.recPlateNum.c_str()); //5.5 結構體數組,寫目標車輛的位置 writer.Key("vvObjectLoc"); writer.StartObject(); for(int j = 0; j < CountobjLoc; j++) { writer.Key(("objectLocation" + std::to_string(j)).c_str()); writer.StartArray(); writer.Int(whiteBoxTestInfo.objLocation[j].x + vecPtShift[j].x); writer.Int(whiteBoxTestInfo.objLocation[j].y + vecPtShift[j].y); writer.Int(whiteBoxTestInfo.objLocation[j].width); writer.Int(whiteBoxTestInfo.objLocation[j].height); writer.EndArray(); } writer.EndObject(); //5.5 結構體數組,寫交警的位置 writer.Key("vvPoliceManDetectionOutput"); writer.StartObject(); for(int i = 0; i < CountPoliceManDetection; i++) { writer.Key(("PoliceManDetection" + std::to_string(i)).c_str()); writer.StartArray(); for(int j = 0; j < whiteBoxTestInfo.vvPoliceManDetectionOutput[i].size(); j++) { if ( whiteBoxTestInfo.vvPoliceManDetectionOutput[i][j].policeStatus == PCLPolice) { writer.Int(whiteBoxTestInfo.vvPoliceManDetectionOutput[i][j].pedestrianLoc.x + vecPtShift[i].x); writer.Int(whiteBoxTestInfo.vvPoliceManDetectionOutput[i][j].pedestrianLoc.y + vecPtShift[i].y); writer.Int(whiteBoxTestInfo.vvPoliceManDetectionOutput[i][j].pedestrianLoc.width); writer.Int(whiteBoxTestInfo.vvPoliceManDetectionOutput[i][j].pedestrianLoc.height); } } writer.EndArray(); } writer.EndObject(); //寫紅綠燈返回的結構體 writer.Key("sARLTestInfo"); writer.StartObject(); { writer.Key("SingleTrifficLightState"); writer.StartObject(); if (whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects.size() > 0) { for(int i = 0; i < CountTrifficLight; i++) { writer.Key(("SingleTrifficLightState" + std::to_string(i)).c_str()); writer.StartArray(); for(int j = 0; j < whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects[i].size(); j++) { writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects[i][j].lightRect.x + vecPtShift[i].x); writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects[i][j].lightRect.y + vecPtShift[i].y); writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects[i][j].lightRect.width); writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects[i][j].lightRect.height); writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.objects[i][j].lightClass); } writer.EndArray(); } } writer.EndObject(); { writer.Key("WholeTrifficLightState"); writer.StartArray(); writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.trafficLightState.sLeftState); writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.trafficLightState.sStraightState); writer.Int(whiteBoxTestInfo.ARLTestInfo.TrifficLight.trafficLightState.sRightState); writer.EndArray(); } } writer.Key("LaneDircetion"); writer.Int(whiteBoxTestInfo.ARLTestInfo.LaneDircetion); writer.Key("CarDirection"); writer.Int(whiteBoxTestInfo.ARLTestInfo.CarDirection); writer.EndObject(); //寫逆行返回的結構體 writer.Key("sRRTestInfo"); writer.StartObject(); writer.Key("LaneDircetion"); writer.Int(whiteBoxTestInfo.RRTestInfo.LaneDircetion); writer.Key("CarPose"); writer.Int(whiteBoxTestInfo.RRTestInfo.CarPose); writer.Key("CarDirection"); writer.Int(whiteBoxTestInfo.RRTestInfo.CarDirection); writer.Key("reverseLaneProportion"); writer.Double(whiteBoxTestInfo.RRTestInfo.reverseLaneProportion); writer.Key("overStopLineProportion"); writer.Double(whiteBoxTestInfo.RRTestInfo.overStopLineProportion); writer.EndObject(); //寫違反導向返回的結構體 writer.Key("sADTestInfo"); writer.StartObject(); writer.Key("LaneDircetion"); writer.Int(whiteBoxTestInfo.RRTestInfo.LaneDircetion); writer.Key("CarPose"); writer.Int(whiteBoxTestInfo.RRTestInfo.CarPose); writer.EndObject(); //寫壓線返回的結構體 writer.Key("sCLALTestInfo"); writer.StartObject(); writer.Key("CarBodyRate"); writer.Double(whiteBoxTestInfo.CLALTestInfo.CarBodyRate); writer.EndObject(); writer.EndObject(); string json = strBuf.GetString(); std::ofstream fout; std::string root_path = "/media/tmp/test/"; fout.open(root_path + "11111.json"); fout << json << std::endl; fout.close(); #endif }
生成的json如下:
{ "recPlateNum":"浙G7FQ66", "vvObjectLoc":{ "objectLocation0":[ 362, 641, 272, 252 ], "objectLocation1":[ 2178, 475, 158, 152 ], "objectLocation2":[ 146, 1340, 185, 73 ] }, "vvPoliceManDetectionOutput":{ "PoliceManDetection0":[ 1114, 148, 18, 42, 1156, 148, 17, 40 ], "PoliceManDetection1":[ 2813, 148, 17, 41, 2716, 139, 23, 34, 2850, 154, 19, 41 ], "PoliceManDetection2":[ 1119, 1185, 18, 38, 1188, 1201, 19, 38 ] }, "sARLTestInfo":{ "SingleTrifficLightState":{ "SingleTrifficLightState0":[ 633, 22, 38, 11, 2, 600, 22, 32, 12, 3 ], "SingleTrifficLightState1":[ 2329, 22, 37, 12, 2, 2296, 21, 29, 13, 3 ], "SingleTrifficLightState2":[ 633, 1057, 38, 12, 2, 598, 1057, 33, 13, 3 ] }, "WholeTrifficLightState":[ 1, 1, 3 ], "LaneDircetion":99, "CarDirection":3 }, "sRRTestInfo":{ "LaneDircetion":99, "CarPose":99, "CarDirection":9, "reverseLaneProportion":0, "overStopLineProportion":0 }, "sADTestInfo":{ "LaneDircetion":99, "CarPose":99 }, "sCLALTestInfo":{ "CarBodyRate":0 } }