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

  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. Nacos做配置中心经常被问到的问题

    加载多个配置文件怎么处理? 通过@NacosPropertySource可以注入一个配置文件,如果我们需要将配置分类存储或者某些配置需要共用,这种需求场景下,一个项目中需要加载多个配置文件,可以可以直 ...

  2. javascript中的闭包、函数的toString方法

    闭包: 闭包可以理解为定义在一个函数内部的函数, 函数A内部定义了函数B, 函数B有访问函数A内部变量的权力: 闭包是函数和子函数之间的桥梁: 举个例子: let func = function() ...

  3. 参数检查(@property)

    绑定属性时,如果直接把属性暴露出去,虽然写起来很简单,但无法对参数进行检查,导致属性被随便修改 因此,可以通过在类内定义get()获取属性值,定义set()对属性值进行设定并对设定值进行检查 但通过定 ...

  4. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 11

    18.8.3  完美分页类的代码实现 分页类的编写除了需要使用在18.8.2节中提供的可以操作的3个成员方法,还需要更多的成员,但其他的成员方法和成员属性只需要内部使用,并不需要用户在对象外部操作,所 ...

  5. Python extend函数解读

    num = [1,2] print('将1迭代2次') num.extend([1]*2) print(num) print('将2迭代3次') num.extend([2] * 3) print(n ...

  6. 基础查询-SQL和Linq相互化

    目录 SELECT SQL SELECT DISTINCT 语句 WHERE 和 操作符 BETWEEN 和操作符 LIKE 和通配符 ORDER BY 排序 TOP In Alias(as) EXI ...

  7. 高效取余运算(n-1)&hash原理探讨

    Java的HashMap源码中用到的(n-1)&hash这样的运算,查找发现这是一种高效的求余数的办法,但其中的原理是什么呢为什么可以这么做呢? 先上结论:假设被除数是x,对于除数是2n的取余 ...

  8. CAD总记不住?设计达人给你支招,最强口诀40条玩转设计

    绘图界有这样一个准则:绘图越快,玩的越6 相反的,CAD玩的很6 ,你的绘图效率一定不会差到哪里去,虽然不能说的太绝对,但你就操作如果玩转,一定你就操作能给你的绘图带来很多效率的提升. 当然后面就你就 ...

  9. sed文本处理

    1.基本概述 sed是一个流编辑器, 非交互式的编辑器,它一次处理一行内容. 处理时,把当前处理的行存储在临时缓冲区中,称* 为"模式空间"(pattern space) 接着用 ...

  10. Vue.js 源码分析(六) 基础篇 计算属性 computed 属性详解

    模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护,比如: <div id="example">{{ messag ...