rapidjson对于json的序列化与反序列化

rapidjson对于json的序列化与反序列化转载:
#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
原⽂:blog.csdn/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())
verticalsync{
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
原⽂:blog.csdn/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.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.PlateNum.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.afficLightState.sLeftState);
writer.Int(whiteBoxTestInfo.afficLightState.sStraightState);
writer.Int(whiteBoxTestInfo.afficLightState.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(verseLaneProportion);        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,

本文发布于:2024-09-21 15:45:05,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/167902.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:类型   解析   数组   结构
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议