json字符串的解析以封装在我们开发过程中经常见到, 尤其在socket通信上面, 在一次项目中碰到json字符串的进行解析, 而公司有没有封装好的库, 于是就自己基于开源的库进行了一次封装, 接下是使用案例, 如果感觉可以, 就去下载我的源代码自己编译一个库出来(能直接编译通过, 无任何依赖),

下载地址: https://download.csdn.net/download/weixin_41370313/11457996

jsonObjDefine.h

  1. #pragma once
  2. #include "../LibJosnSerial/JsonBase.h"
  3. #include <string>
  4. using namespace JsonBaseHelper;
  5. using namespace std;
  6. class Person : public JsonBase
  7. {
  8. public:
  9. string name;
  10. string sex;
  11. int age;
  12. int ident;
  13. void ToWrite(Writer<StringBuffer> &writer)
  14. {
  15. RapidjsonWriteBegin(writer);
  16. RapidjsonWriteString(name);
  17. RapidjsonWriteString(sex);
  18. RapidjsonWriteInt(age);
  19. RapidjsonWriteInt(ident);
  20. RapidjsonWriteEnd();
  21. }
  22. void ParseJson(const Value& val)
  23. {
  24. RapidjsonParseBegin(val);
  25. RapidjsonParseToString(name);
  26. RapidjsonParseToString(sex);
  27. RapidjsonParseToInt(age);
  28. RapidjsonParseToInt(ident);
  29. RapidjsonParseEnd();
  30. }
  31. };
  32.  
  33. class MacPropery : public JsonBase
  34. {
  35. public:
  36. int count;
  37. float perMachine;
  38. int machineCount;
  39. string operationTime;
  40. void ToWrite(Writer<StringBuffer> &writer)
  41. {
  42. RapidjsonWriteBegin(writer);
  43. RapidjsonWriteInt(count);
  44. RapidjsonWriteDouble(perMachine);
  45. RapidjsonWriteInt(machineCount);
  46. RapidjsonWriteString(operationTime);
  47. RapidjsonWriteEnd();
  48. };
  49. void ParseJson(const Value& val)
  50. {
  51. RapidjsonParseBegin(val);
  52. RapidjsonParseToInt(count);
  53. RapidjsonParseToDouble(perMachine);
  54. RapidjsonParseToInt(machineCount);
  55. RapidjsonParseToString(operationTime);
  56. RapidjsonParseEnd();
  57. };
  58. };
  59.  
  60. class PrintMacInfo : public JsonBase
  61. {
  62. public:
  63. int code;
  64. string message;
  65. JsonArray<MacPropery> data;
  66. void ToWrite(Writer<StringBuffer> &writer)
  67. {
  68. RapidjsonWriteBegin(writer);
  69. RapidjsonWriteInt(code);
  70. RapidjsonWriteString(message);
  71. RapidjsonWriteClass(data);
  72. RapidjsonWriteEnd();
  73. };
  74. void ParseJson(const Value& val)
  75. {
  76. RapidjsonParseBegin(val);
  77. RapidjsonParseToInt(code);
  78. RapidjsonParseToString(message);
  79. RapidjsonParseToClass(data);
  80. RapidjsonParseEnd();
  81. };
  82. };

  测试demo

  1. #include <iostream>
  2. #include "JsonObjDefine.h" //定义json对象头文件
  3. #include <iostream>
  4. //基于rapidjson封装的库
  5. #pragma comment(lib, "..\\LibJosnSerial\\Bin\\LibJosnSerial.lib")
  6. int main()
  7. {
  8. std::cout << "基础json字符串转换\n";
  9. Person per;
  10. per.age = 99;
  11. per.ident = 123;
  12. per.name = "测试";
  13. per.sex = "男性";
  14. string strPerJson = JsonBase::SerializeJson(&per);
  15. std::cout << "Person -> Json字符串:" << std::endl << strPerJson << std::endl;
  16. std::cout << endl;
  17. std::cout << "Json字符串 -> Person" << std::endl;
  18. Person perRet;
  19. JsonBase::DeserializeJson(&perRet, strPerJson);
  20. cout << "age: " << perRet.age << endl;
  21. cout << "ident: " << perRet.ident << endl;
  22. cout << "name: " << perRet.name << endl;
  23. cout << "sex: " << perRet.sex << endl;
  24. std::cout << endl;
  25.  
  26. std::cout << "有嵌套json字符串转换\n";
  27. PrintMacInfo printMac;
  28. printMac.code = 0;
  29. printMac.message = "测试json字符串";
  30. MacPropery mac_1;
  31. mac_1.count = 6031;
  32. mac_1.perMachine = 861.57;
  33. mac_1.machineCount = 7;
  34. mac_1.operationTime = "2012";
  35. printMac.data.objList.push_back(mac_1);
  36. MacPropery mac_2;
  37. mac_2.count = 20754;
  38. mac_2.perMachine = 2964.86;
  39. mac_2.machineCount = 7;
  40. mac_2.operationTime = "2018";
  41. printMac.data.objList.push_back(mac_2);
  42. string strJson = JsonBase::SerializeJson(&printMac);
  43. std::cout << "PrintMacInfo -> Json字符串:"<< std::endl << strJson<<std::endl;
  44. std::cout << endl;
  45. std::cout << "Json字符串 -> PrintMacInfo" << endl;
  46. PrintMacInfo printMacRet;
  47. JsonBase::DeserializeJson(&printMacRet, strJson);
  48. cout << "code:"<< printMacRet.code << endl;
  49. cout << "message" << printMacRet.message << endl;
  50. int index = 1;
  51. for each(auto it in printMacRet.data.objList)
  52. {
  53. cout << "data_MacPro_"<<index<<": "<< it.count << endl;
  54. cout << "data_MacPro_"<<index<<": "<< it.machineCount << endl;
  55. cout << "data_MacPro_"<<index<<": "<< it.perMachine << endl;
  56. cout << "data_MacPro_"<<index<<": "<< it.operationTime << endl;
  57. cout << endl;
  58. index++;
  59. }
  60. getchar();
  61. }

  打印输出:

普通字符串格式

{
"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字符串的进行序列化与反序列化的更多相关文章

  1. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化

    度娘许久,找不到我满意的答案,于是自己东凑西凑实现一个. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化,亲测良好. 看代码 using System; ...

  2. JSON与对象的序列化与反序列化

    一.利用JavaScriptSerializer 类 System.Web.Script.Serialization空间,位于System.Web.extensions.dll中. JavaScrip ...

  3. ASP.NET中JSON对时间进行序列化和反序列化

    JSON格式不直接支持日期和时间.DateTime值显示为“/Date(0+0800)/”形式的JSON字符串,其中第一个数字是GMT时区中自1970年1月1 日午夜以来按正常时间(非夏令时)经过的毫 ...

  4. json相关注解和序列化与反序列化

    使用jackson进行序列化时,往往会遇到后台某个实体对象的属性为null,当序列化成json时对应的属性也为null,可以用以下的注解方式完成当属性为null时不参与序列化: @JsonSerial ...

  5. json 字符串转换成对象,对象转换成json字符串

    json   字符串转换成对象,对象转换成json字符串 前端: 方法一: parseJSON方法:   [注意jquery版本问题] var str = '{"name":&qu ...

  6. Newtonsoft.Json高级用法,json序列号,model反序列化,支持序列化和反序列化DataTable,DataSet,Entity Framework和Entity,字符串

    原文地址:https://www.cnblogs.com/yanweidie/p/4605212.html 手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口 ...

  7. Newtonsoft.Json.dll 反序列化JSON字符串

    上一篇JSON博客<JSON入门级学习小结--JSON数据结构>中已对JSON做了简单介绍,JSON字符串数组数据样式大概是这样子的: 如今因为项目需求(asp.net web网站,前台向 ...

  8. 解决json字符串转为对象时LocalDateTime异常问题

    1 出现异常 这次的异常出现在前端向后端发送请求体里带了两个日期,在后端的实体类中,这两个日期的格式都是JDK8中的时间类LocalDateTime.默认情况下,LocalDateTime只能解析20 ...

  9. python序列化与反序列化(json、pickle)-(五)

    1.什么是序列化&反序列化? 序列化:将字典.列表.类的实例对象等内容转换成一个字符串的过程. 反序列化:将一个字符串转换成字典.列表.类的实例对象等内容的过程 PS:Python中常见的数据 ...

随机推荐

  1. 趣谈Linux操作系统学习笔记:第二十八讲

    一.引子 磁盘→盘片→磁道→扇区(每个 512 字节) ext* 定义文件系统的格式 二.inode 与块的存储 1.块 2.不用给他分配一块连续的空间 我们可以分散成一个个小块进行存放 1.优点 2 ...

  2. __doc__

    目录 一.__doc__ 一.__doc__ 返回类的注释信息 class Foo: '我是描述信息' pass print(Foo.__doc__) 我是描述信息 该属性无法被继承 class Fo ...

  3. 现象:SpringApplication.run后面的语句未执行

    下面的两种情况下,红色的log.info中的内容一直没有执行,和预期不符. 看来,需要在@PostConstruct修饰的函数.CommandLineRunner的run方法中调用 另外的线程 来执行 ...

  4. 1+x证书Web前端开发HTML+CSS专项练习测试题(八)

    1+x证书Web前端开发HTML+CSS专项练习测试题(八) 官方QQ群 1+x 证书 Web 前端开发 HTML+CSS 专项练习测试题(八) http://blog.zh66.club/index ...

  5. SQLServer某个库log日志过大,无法收缩日志文件 ,因为该文件结尾的逻辑日志文件正在使用

    问题描述: 今天看到user库日志备份方面很久,然后查看到user库这个log日志很大 图片是我已经解决了,然后现在可以收缩的大小 解决方法: 1.先备份user库日志,因为很大,所以要等很久,这个只 ...

  6. Linux下科学计数法(e)转化为数字的方法 [shell中几种数字计算说明]

    科学计数法使用e标识数值,将科学计算学转化为数字的思路:按e右边的数字移动小数点位数.e右边的数字如果是负数,则向左移动小数点.示例如下: 1.2345678e2 = 123.45678 1.2345 ...

  7. 【zabbix告警配置】zabbix服务配置邮件告警

    一.安装邮件服务 在zabbix_server服务端安装邮件和邮件发送服务,这里可以参考我另一篇邮件服务部署文章:https://www.cnblogs.com/HeiDi-BoKe/p/118833 ...

  8. Linux 安装 MySQL 出现 Could NOT find Curses

    通过源码安装 MySQL 数据库,下载了 mysql-5.5.24 的版本,在使用 cmake 时产生了报错,如下: CMake Error at cmake/readline.cmake: (MES ...

  9. Alpine Linux 安装 lxml Pillow 失败

    lixm 需要编译安装,因此需要先安装gcc g++ RUN apk add --update --no-cache g++ gcc libxslt-dev python3-dev openssl-d ...

  10. 2018-8-10-win10-uwp-依赖属性

    原文:2018-8-10-win10-uwp-依赖属性 title author date CreateTime categories win10 uwp 依赖属性 lindexi 2018-08-1 ...