rapidjson对于json的序列化与反序列化
转载:
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
}
}
rapidjson对于json的序列化与反序列化的更多相关文章
- [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化
[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...
- C#中的Json的序列化和反序列化
Json是一种通用的数据格式,我们在数据交换的时候,经常会用到,下面介绍c#中的json序列化和反序列化,当然也可用在asp.net,silverlight,wpf中.我们在下面实例讲解如何进行Jso ...
- Json的序列化与反序列化
对于Json的序列化和反序列化,如果自己编写源代码来实现的话,很复杂很烦,所以我采用的是使用别人已经写好的引用文件.这类文件网上有很多,我用的是LitJson,当然Newtonsoft也可以,但后者需 ...
- Newtonsoft.Json 的序列化与反序列化
首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...
- ASP.NET MVC 网站开发总结(六)——简谈Json的序列化与反序列化
首先,先简单的谈一下什么是序列化与反序列化,序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通 ...
- Asp.net中Json的序列化和反序列化(一)
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
- ASP.NET中JSON的序列化和反序列化
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介 ...
- C# JSON字符串序列化与反序列化
JSON与c#对象转换http://hi.baidu.com/donick/item/4d741338870c91fe97f88d33 C# JSON字符串序列化与反序列化 – http://www. ...
- ASP.NET 中JSON 的序列化和反序列化
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
随机推荐
- iOS ipa 重签名 resign
这篇关于codesign的文章不错 https://www.objccn.io/issue-17-2/ 英文原文:https://www.objc.io/issues/17-security/insi ...
- @ApiModelProperty的用法
@ApiModelProperty()用于方法,字段: 表示对model属性的说明或者数据操作更改 value–字段说明 name–重写属性名字 dataType–重写属性类型 required–是否 ...
- LuoGu P4996 咕咕咕
题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...
- 剑指offer数组1
面试题3:数组中重复的数字 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例 ...
- 005-Spring Boot配置分析-配置文件application、EnvironmentPostProcessor、Profiles
一.配置文件application 默认配置文件application.propertie或者application.yml,可同时存在 application.propertie增加配置:local ...
- Angular项目中核心模块core Module只加载一次的实现
核心模块CoreModule在整个系统中只加载一次,如何实现? 创建core Modele:ng g m core 既然CoreModule是类,就有构造函数,在构造函数中进行依赖注入. export ...
- C#实现短链接生成服务
项目中有一处需求,需要把长网址缩为短网址,把结果通过短信.微信等渠道推送给客户.刚开始直接使用网上现成的开放服务,然后在某个周末突然手痒想自己动手实现一个别具特色的长网址(文本)缩短服务. 由于以前做 ...
- sklearn数据库-【老鱼学sklearn】
在做机器学习时需要有数据进行训练,幸好sklearn提供了很多已经标注好的数据集供我们进行训练. 本节就来看看sklearn提供了哪些可供训练的数据集. 这些数据位于datasets中,网址为:htt ...
- LINUX更改桌面的分辨率
命令行 输入xrandr 输入xrandr命令后可以看到系统的一些分辨率的列表, 和当前系统屏幕的分辨率信息,可以通过命令的 相应参数对系统分辨率的一些设置操作. xrandr -s 0 全屏 xra ...
- Node.js_express_服务器渲染页面 ejs
服务器渲染页面 ejs 高效的 js 模版引擎 将数据提前渲染到页面上, 再将渲染好的页面返回响应给浏览器 提高首页加载速度 SEO 提前处理,提高加载速度 下载 ejs 包 npm install ...