C++ 基于rapidjson对json字符串的进行序列化与反序列化
json字符串的解析以封装在我们开发过程中经常见到, 尤其在socket通信上面, 在一次项目中碰到json字符串的进行解析, 而公司有没有封装好的库, 于是就自己基于开源的库进行了一次封装, 接下是使用案例, 如果感觉可以, 就去下载我的源代码自己编译一个库出来(能直接编译通过, 无任何依赖),
下载地址: https://download.csdn.net/download/weixin_41370313/11457996
jsonObjDefine.h
- #pragma once
- #include "../LibJosnSerial/JsonBase.h"
- #include <string>
- using namespace JsonBaseHelper;
- using namespace std;
- class Person : public JsonBase
- {
- public:
- string name;
- string sex;
- int age;
- int ident;
- void ToWrite(Writer<StringBuffer> &writer)
- {
- RapidjsonWriteBegin(writer);
- RapidjsonWriteString(name);
- RapidjsonWriteString(sex);
- RapidjsonWriteInt(age);
- RapidjsonWriteInt(ident);
- RapidjsonWriteEnd();
- }
- void ParseJson(const Value& val)
- {
- RapidjsonParseBegin(val);
- RapidjsonParseToString(name);
- RapidjsonParseToString(sex);
- RapidjsonParseToInt(age);
- RapidjsonParseToInt(ident);
- RapidjsonParseEnd();
- }
- };
- class MacPropery : public JsonBase
- {
- public:
- int count;
- float perMachine;
- int machineCount;
- string operationTime;
- void ToWrite(Writer<StringBuffer> &writer)
- {
- RapidjsonWriteBegin(writer);
- RapidjsonWriteInt(count);
- RapidjsonWriteDouble(perMachine);
- RapidjsonWriteInt(machineCount);
- RapidjsonWriteString(operationTime);
- RapidjsonWriteEnd();
- };
- void ParseJson(const Value& val)
- {
- RapidjsonParseBegin(val);
- RapidjsonParseToInt(count);
- RapidjsonParseToDouble(perMachine);
- RapidjsonParseToInt(machineCount);
- RapidjsonParseToString(operationTime);
- RapidjsonParseEnd();
- };
- };
- class PrintMacInfo : public JsonBase
- {
- public:
- int code;
- string message;
- JsonArray<MacPropery> data;
- void ToWrite(Writer<StringBuffer> &writer)
- {
- RapidjsonWriteBegin(writer);
- RapidjsonWriteInt(code);
- RapidjsonWriteString(message);
- RapidjsonWriteClass(data);
- RapidjsonWriteEnd();
- };
- void ParseJson(const Value& val)
- {
- RapidjsonParseBegin(val);
- RapidjsonParseToInt(code);
- RapidjsonParseToString(message);
- RapidjsonParseToClass(data);
- RapidjsonParseEnd();
- };
- };
测试demo
- #include <iostream>
- #include "JsonObjDefine.h" //定义json对象头文件
- #include <iostream>
- //基于rapidjson封装的库
- #pragma comment(lib, "..\\LibJosnSerial\\Bin\\LibJosnSerial.lib")
- int main()
- {
- std::cout << "基础json字符串转换\n";
- Person per;
- per.age = 99;
- per.ident = 123;
- per.name = "测试";
- per.sex = "男性";
- string strPerJson = JsonBase::SerializeJson(&per);
- std::cout << "Person -> Json字符串:" << std::endl << strPerJson << std::endl;
- std::cout << endl;
- std::cout << "Json字符串 -> Person" << std::endl;
- Person perRet;
- JsonBase::DeserializeJson(&perRet, strPerJson);
- cout << "age: " << perRet.age << endl;
- cout << "ident: " << perRet.ident << endl;
- cout << "name: " << perRet.name << endl;
- cout << "sex: " << perRet.sex << endl;
- std::cout << endl;
- std::cout << "有嵌套json字符串转换\n";
- PrintMacInfo printMac;
- printMac.code = 0;
- printMac.message = "测试json字符串";
- MacPropery mac_1;
- mac_1.count = 6031;
- mac_1.perMachine = 861.57;
- mac_1.machineCount = 7;
- mac_1.operationTime = "2012";
- printMac.data.objList.push_back(mac_1);
- MacPropery mac_2;
- mac_2.count = 20754;
- mac_2.perMachine = 2964.86;
- mac_2.machineCount = 7;
- mac_2.operationTime = "2018";
- printMac.data.objList.push_back(mac_2);
- string strJson = JsonBase::SerializeJson(&printMac);
- std::cout << "PrintMacInfo -> Json字符串:"<< std::endl << strJson<<std::endl;
- std::cout << endl;
- std::cout << "Json字符串 -> PrintMacInfo" << endl;
- PrintMacInfo printMacRet;
- JsonBase::DeserializeJson(&printMacRet, strJson);
- cout << "code:"<< printMacRet.code << endl;
- cout << "message" << printMacRet.message << endl;
- int index = 1;
- for each(auto it in printMacRet.data.objList)
- {
- cout << "data_MacPro_"<<index<<": "<< it.count << endl;
- cout << "data_MacPro_"<<index<<": "<< it.machineCount << endl;
- cout << "data_MacPro_"<<index<<": "<< it.perMachine << endl;
- cout << "data_MacPro_"<<index<<": "<< it.operationTime << endl;
- cout << endl;
- index++;
- }
- getchar();
- }
打印输出:
普通字符串格式
{
"name": "测试",
"sex": "男性",
"age": 99,
"ident": 123
}
有嵌套json字符串格式
{
"code": 0,
"message": "测试json字符串",
"data": [{
"count": 6031,
"perMachine": 861.5700073242188,
"machineCount": 7,
"operationTime ": "2012 "
},
{
"count ": 20754,
"perMachine ": 2964.860107421875,
"machineCount ": 7,
"operationTime ": "2018 "
}
]
}
C++ 基于rapidjson对json字符串的进行序列化与反序列化的更多相关文章
- DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化
度娘许久,找不到我满意的答案,于是自己东凑西凑实现一个. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化,亲测良好. 看代码 using System; ...
- JSON与对象的序列化与反序列化
一.利用JavaScriptSerializer 类 System.Web.Script.Serialization空间,位于System.Web.extensions.dll中. JavaScrip ...
- ASP.NET中JSON对时间进行序列化和反序列化
JSON格式不直接支持日期和时间.DateTime值显示为“/Date(0+0800)/”形式的JSON字符串,其中第一个数字是GMT时区中自1970年1月1 日午夜以来按正常时间(非夏令时)经过的毫 ...
- json相关注解和序列化与反序列化
使用jackson进行序列化时,往往会遇到后台某个实体对象的属性为null,当序列化成json时对应的属性也为null,可以用以下的注解方式完成当属性为null时不参与序列化: @JsonSerial ...
- json 字符串转换成对象,对象转换成json字符串
json 字符串转换成对象,对象转换成json字符串 前端: 方法一: parseJSON方法: [注意jquery版本问题] var str = '{"name":&qu ...
- Newtonsoft.Json高级用法,json序列号,model反序列化,支持序列化和反序列化DataTable,DataSet,Entity Framework和Entity,字符串
原文地址:https://www.cnblogs.com/yanweidie/p/4605212.html 手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口 ...
- Newtonsoft.Json.dll 反序列化JSON字符串
上一篇JSON博客<JSON入门级学习小结--JSON数据结构>中已对JSON做了简单介绍,JSON字符串数组数据样式大概是这样子的: 如今因为项目需求(asp.net web网站,前台向 ...
- 解决json字符串转为对象时LocalDateTime异常问题
1 出现异常 这次的异常出现在前端向后端发送请求体里带了两个日期,在后端的实体类中,这两个日期的格式都是JDK8中的时间类LocalDateTime.默认情况下,LocalDateTime只能解析20 ...
- python序列化与反序列化(json、pickle)-(五)
1.什么是序列化&反序列化? 序列化:将字典.列表.类的实例对象等内容转换成一个字符串的过程. 反序列化:将一个字符串转换成字典.列表.类的实例对象等内容的过程 PS:Python中常见的数据 ...
随机推荐
- 趣谈Linux操作系统学习笔记:第二十八讲
一.引子 磁盘→盘片→磁道→扇区(每个 512 字节) ext* 定义文件系统的格式 二.inode 与块的存储 1.块 2.不用给他分配一块连续的空间 我们可以分散成一个个小块进行存放 1.优点 2 ...
- __doc__
目录 一.__doc__ 一.__doc__ 返回类的注释信息 class Foo: '我是描述信息' pass print(Foo.__doc__) 我是描述信息 该属性无法被继承 class Fo ...
- 现象:SpringApplication.run后面的语句未执行
下面的两种情况下,红色的log.info中的内容一直没有执行,和预期不符. 看来,需要在@PostConstruct修饰的函数.CommandLineRunner的run方法中调用 另外的线程 来执行 ...
- 1+x证书Web前端开发HTML+CSS专项练习测试题(八)
1+x证书Web前端开发HTML+CSS专项练习测试题(八) 官方QQ群 1+x 证书 Web 前端开发 HTML+CSS 专项练习测试题(八) http://blog.zh66.club/index ...
- SQLServer某个库log日志过大,无法收缩日志文件 ,因为该文件结尾的逻辑日志文件正在使用
问题描述: 今天看到user库日志备份方面很久,然后查看到user库这个log日志很大 图片是我已经解决了,然后现在可以收缩的大小 解决方法: 1.先备份user库日志,因为很大,所以要等很久,这个只 ...
- Linux下科学计数法(e)转化为数字的方法 [shell中几种数字计算说明]
科学计数法使用e标识数值,将科学计算学转化为数字的思路:按e右边的数字移动小数点位数.e右边的数字如果是负数,则向左移动小数点.示例如下: 1.2345678e2 = 123.45678 1.2345 ...
- 【zabbix告警配置】zabbix服务配置邮件告警
一.安装邮件服务 在zabbix_server服务端安装邮件和邮件发送服务,这里可以参考我另一篇邮件服务部署文章:https://www.cnblogs.com/HeiDi-BoKe/p/118833 ...
- Linux 安装 MySQL 出现 Could NOT find Curses
通过源码安装 MySQL 数据库,下载了 mysql-5.5.24 的版本,在使用 cmake 时产生了报错,如下: CMake Error at cmake/readline.cmake: (MES ...
- Alpine Linux 安装 lxml Pillow 失败
lixm 需要编译安装,因此需要先安装gcc g++ RUN apk add --update --no-cache g++ gcc libxslt-dev python3-dev openssl-d ...
- 2018-8-10-win10-uwp-依赖属性
原文:2018-8-10-win10-uwp-依赖属性 title author date CreateTime categories win10 uwp 依赖属性 lindexi 2018-08-1 ...