c++ 使用rapidjson对数据序列化和反序列化(vs2109)

  RapidJSON是腾讯开源的一个高效的C++ JSON解析器及生成器,它是只有头文件的C++库,综合性能是最好的。

1. 安装

在NuGet中为项目安装tencent.rapidjson

2. 引用头文件

#include <rapidjson/document.h>
#include <rapidjson/memorystream.h>
#include <rapidjson/prettywriter.h>


3. 头文件定义

添加测试json字符串和类型对应数组

// 测试json字符串
const char* strJson = "{\"name\":\"MenAngel\",\"age\":23,\"hobbys\":[\"语文\",\"数学\",\"英语\",54],\"scores\":{\"数学\":\"90.6\",\"英语\":\"100.0\", \"语文\":\"80.0\"}}";// 数据类型,和 rapidjson的enum Type 相对应
static const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" };

 

4.  修改JSON 内容

/// <summary>
///  修改JSON 内容
/// </summary>
void MyRapidJson::alterJson()
{rapidjson::Document doc;doc.Parse(strJson);cout << "修改前: " << strJson <<"\n" << endl;// 修改内容rapidjson::Value::MemberIterator iter = doc.FindMember("name");if (iter != doc.MemberEnd())doc["name"] = "张三";iter = doc.FindMember("age");if (iter != doc.MemberEnd()){rapidjson::Value& v1 = iter->value;v1 = "40";}// 修改后的内容写入 StringBuffer 中rapidjson::StringBuffer buffer;rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);doc.Accept(writer);cout <<"修改后: " << buffer.GetString() << "\n" << endl;
}

运行结果:

{"name":"张三","age":"40","hobbys":["语文","数学","英语",54],"scores":{"数学":"90.6","英语":"100.0","语文":"80.0"}}

5. 生成 json 数据

/// <summary>
/// 生成JSON数据
/// </summary>
void MyRapidJson::createJson()
{// 1.准备数据string name = "王五";string gender = "boy";int age = 23;bool student = true;vector<string> hobbys = { "语文","数学","英语" };map<string, double> scores = { {"语文",80},{"数学",90},{"英语",100} };//2.初始化DOMrapidjson::Document doc;rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();doc.SetObject();// 添加数据/* 字符串添加 */ rapidjson::Value tempValue1;tempValue1.SetString(name.c_str(), allocator);doc.AddMember("name", tempValue1, allocator);rapidjson::Value tempValue2(rapidjson::kStringType);tempValue2.SetString(gender.c_str(), allocator);doc.AddMember(rapidjson::StringRef("gender"), tempValue2, allocator);/* 数字类型添加 */doc.AddMember("age", age, allocator);/* bool 类型 */rapidjson::Value tempValueStu(rapidjson::kTrueType);tempValueStu.SetBool(student);doc.AddMember(rapidjson::StringRef("student"), tempValueStu, allocator);/* Array 添加数据 */rapidjson::Value tempValue3(rapidjson::kArrayType);for (auto hobby : hobbys){rapidjson::Value hobbyValue(rapidjson::kStringType);hobbyValue.SetString(hobby.c_str(), allocator);tempValue3.PushBack(hobbyValue, allocator);}doc.AddMember("hobbys", tempValue3, allocator);/* Object 添加 */rapidjson::Value tempValue4(rapidjson::kObjectType);tempValue4.SetObject();for (auto score : scores){//rapidjson::Value scoreName(rapidjson::kStringType);//scoreName.SetString(score.first.c_str(), allocator);//tempValue4.AddMember(scoreName, score.second, allocator);// 方法二rapidjson::Value scoreName(rapidjson::kStringType);scoreName.SetString(score.first.c_str(), allocator);rapidjson::Value scoreValue(rapidjson::kStringType);char charValue[20];itoa(score.second, charValue,10);scoreValue.SetString(charValue, allocator);tempValue4.AddMember(scoreName, scoreValue, allocator);}doc.AddMember("scores", tempValue4, allocator);// 写入 StringBufferrapidjson::StringBuffer strBuffer;rapidjson::Writer<rapidjson::StringBuffer> writer(strBuffer);doc.Accept(writer);cout << strBuffer.GetString() << "\n" << endl;string outFileName = "C:\\Users\\Administrator\\Desktop\\creatJson.txt";ofstream outfile(outFileName, std::ios::trunc);outfile << strBuffer.GetString() << endl;outfile.flush();outfile.close(); 
}

运行结果:

{"name":"王五","gender":"boy","age":23,"student":true,"hobbys":["语文","数学","英语"],"scores":{"数学":"90","英语":"100","语文":"80"}}

6. json 数据解析

/// <summary>
/// 查询json 内容
/// </summary>
void MyRapidJson::searchJson()
{rapidjson::Document doc;if (doc.Parse(strJson).HasParseError()){std::cout << "json 解析错误" << std::endl;return;}cout << "doc 的属性成员有 " << doc.MemberCount() << "个!" << endl;vector<string> propertyName;int i = 0;for (rapidjson::Value::MemberIterator iter = doc.MemberBegin(); iter != doc.MemberEnd(); ++iter){cout << ++i << "、 " << iter->name.GetString() << "    is " << kTypeNames[iter->value.GetType()] << endl;propertyName.push_back(iter->name.GetString());}cout << endl;for (rapidjson::Value::MemberIterator iter = doc.MemberBegin(); iter != doc.MemberEnd(); ++iter){if (iter->value.GetType() == rapidjson::kObjectType || iter->value.GetType() == rapidjson::kArrayType)cout << iter->name.GetString() << " : " << endl;else cout << iter->name.GetString() << " : ";DfsDocument(std::move(iter->value));}
}/// <summary>
///  遍历里面的内容
/// </summary>
/// <param name="val"></param>
void MyRapidJson::DfsDocument(rapidjson::Value val)
{if (!val.GetType())return;switch (val.GetType()) {case rapidjson::kNumberType:cout << val.GetInt() << endl;break;case rapidjson::kStringType:cout << val.GetString() << endl;break;case rapidjson::kArrayType:for (rapidjson::Value::ValueIterator itr = val.GetArray().begin();itr != val.GetArray().end(); ++itr) {rapidjson::Value a;a = *itr;DfsDocument(std::move(a));}break;case rapidjson::kObjectType:for (rapidjson::Value::MemberIterator itr = val.GetObject().begin();itr != val.GetObject().end(); ++itr) {cout << itr->name.GetString() << " ";rapidjson::Value a;a = itr->value;DfsDocument(std::move(a));}default:break;}
}

运行结果

这里需要注意: 

object 类型json字符串中,“数字类型” 需转为 “字符串”,否则查询时会报错。

7.  rapidjson 的其他使用方法

/// <summary>
/// json 属性
/// </summary>
void MyRapidJson::JsonAttribute()
{rapidjson::Document doc;if (doc.Parse(strJson).HasParseError()){std::cout << "json 解析错误" << std::endl;return;}// 成员判断if (doc.HasMember("hobbys") && !doc["hobbys"].Empty())cout << "doc[\"hobbys\"] is not empty!" << "\n" << endl;elsecout << "doc[\"hobbys\"] 不存在。" << "\n" << endl;//7.Array的大小if (doc["hobbys"].IsArray()){cout << "doc[\"hobbys\"].Capacity() =  \"  Array的容量及大小:\" " << doc["hobbys"].Capacity() << " 项" << endl;cout << "doc[\"hobbys\"].Size() =  \"  Array的容量及大小:\" " << doc["hobbys"].Size() << " 项" << endl;}// 字符串长度获取cout << doc["name"].GetString()  <<"  字符串长度 :" << doc["name"].GetStringLength() << endl;//4.查询某个成员是否存在rapidjson::Value::MemberIterator iter = doc.FindMember("scores");if (iter != doc.MemberEnd()){cout << iter->name.GetString() << " : " << endl;DfsDocument(std::move(iter->value));}elsecout << "Not Finded!" << endl;// 相同判断if (doc["name"].GetString() == string("MenAngel") &&doc["name"] == "MenAngel" && strcmp(doc["name"].GetString(),"MenAngel") == 0){cout << "判断为相等" << endl;}}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143767.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

java进阶-Netty

Netty 在此非常感谢尚硅谷学院以及韩顺平老师在B站公开课 Netty视频教程 Netty demo代码文件 I/O 说NIO之前先说一下BIO&#xff08;Blocking IO&#xff09;,如何理解这个Blocking呢&#xff1f;客户端监听&#xff08;Listen&#xff09;时&#xff0c;Accept是阻塞的&…

使用SPY++查看窗口信息去排查客户端UI软件问题

目录 1、使用SPY查看窗口的信息 2、使用SPY查看某些软件UI窗口用什么UI组件实现的 2.1、查看海康视频监控客户端安装包程序 2.2、查看华为协同办公软件WeLink 2.3、查看字节协同办公软件飞书 2.4、查看最新版本的Chrome浏览器 2.5、查看小鱼易连视频会议客户端软件 2.6…

WindTerm 安装使用教程【图解】

往期回顾 MobaXtermMobaXterm 安装使用教程【图解】-CSDN博客WindTermWindTerm 安装使用教程【图解】-CSDN博客 一、WindTerm 功能介绍 WindTerm 是一款 Github 上开源的 SSH 终端工具&#xff0c;到目前为止它已经收获了 16.9K 颗星&#xff0c;它是完全可以比肩 MobaXterm 工…

C语言的学习快速入门

可以按照以下步骤进行&#xff1a; 了解基本概念和语法&#xff1a;C语言是一种结构化的编程语言&#xff0c;了解基本的语法规则对于入门非常重要。可以学习关键字、变量、数据类型、运算符、控制结构等基本概念。学习编程环境&#xff1a;选择合适的编程环境&#xff0c;例如…

Spring事务几种的集中原因

Spring事务失效的几种原因 Spring Boot 项目中事务失效的原因可以有多种&#xff0c;这些原因可能导致你的事务无法正常工作。以下是一些常见的事务失效原因的详细讲解&#xff1a; 不使用Transactional注解&#xff1a; 事务需要通过Transactional注解来声明&#xff0c;如果…

基于yolov5的ignore classes训练

本文提到的忽略类别和检测中的忽略类别不一样&#xff0c;前者是在训练中加入忽略类&#xff0c;后者是在检测中仅检测想要的类。 ignore class的定义 我们在标注数据集的时候都是标注的正样本&#xff0c;训练过程中也是这样训练&#xff0c;让网络对正样本计算loss。但我们…

五、C#—字符串

&#x1f33b;&#x1f33b; 目录 一、字符串1.1 字符类型1.2 转义字符1.3 字符串的声明及赋值1.3.1 c# 中的字符串1.3.2 声明字符串1.3.3 使用字符串1.3.4 字符串的初始化1.3.4.1 引用字符串常量之初始化1.3.4.2 利用字符数组初始化1.3.4.3 提取数组中的一部分进行初始化 1.3.…

R的一些奇奇怪怪的功能

1. 欧氏距离计算 df <- data.frame(x 1:10, y 1:10, row.names paste0("s", 1:10)) euro_dist <- as.matrix(dist(df))2. 集合运算 union(x, y) # 并集 intersect(x, y) # 交集 setdiff(x, y) # 只在x中存在&#xff0c;y中不存在的元素 setequal(x, y)…

利用Redis实现全局唯一ID

利用Redis实现全局唯一ID 背景 场景分析&#xff1a;如果我们的id具有太明显的规则&#xff0c;用户或者说商业对手很容易猜测出来我们的一些敏感信息&#xff0c;比如商城在一天时间内&#xff0c;卖出了多少单&#xff0c;这明显不合适。 场景分析二&#xff1a;随着我们商…

慢性疼痛治疗服务公司Kindly MD申请700万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉,慢性疼痛治疗服务公司Kindly MD近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为&#xff08;KDLY&#xff09;,Kindly MD计划通过…

PTA程序辅助实验平台——2023年软件设计综合实践_3(分支与循环)

第一题&#xff1a;7-1 印第安男孩 - C/C 分支与循环 朵拉编程的时候也想顺便练习英语。她编程从键盘读入一个整数n&#xff0c;如果n值为0或者1&#xff0c;向屏幕输出“0 indian boy.”或“1 indian boy.”&#xff1b;如果n大于1&#xff0c;比如9&#xff0c;则输出“9 in…

计算机图像处理:图像轮廓

图像轮廓 图像阈值分割主要是针对图片的背景和前景进行分离&#xff0c;而图像轮廓也是图像中非常重要的一个特征信息&#xff0c;通过对图像轮廓的操作&#xff0c;就能获取目标图像的大小、位置、方向等信息。画出图像轮廓的基本思路是&#xff1a;先用阈值分割划分为两类图…

性能测试 —— 性能测试常见的测试指标 !

一、什么是性能测试 先看下百度百科对它的定义&#xff0c;性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 我们可以认为性能测试是&#xff1a;通过在测试环境下对系统或构件的性能进行探测&#xff0c;用以验证在生产环…

mysql面试题3:谈谈你知道的MySQL索引?MySQL中一个表可以创建多少个列索引?MySQL索引有哪几种?他们的优缺点是什么?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:谈谈你知道的MySQL索引? MySQL索引是一种特殊的数据结构,用于加速数据库的查询操作。它通过存储列值和对应记录的指针,可以快速定位到满足查询…

如果只是用php纯做api的话,给移动端做数据接口,是否需要用php框架?

API接口对接是现代软件开发中不可或缺的一部分&#xff0c;它允许不同的应用程序之间进行数据交换和服务调用。在PHP中&#xff0c;可以使用多种方式实现API接口的对接&#xff0c;包括基于HTTP协议的传统方法以及现代的API客户端库客户端库客户端库等。 一、实现API接口的对接…

【React】组件实例三大属性state、props、refs

state React 把组件看成是一个状态机&#xff08;State Machines&#xff09;。通过与用户的交互&#xff0c;实现不同状态&#xff0c;然后渲染 UI&#xff0c;让用户界面和数据保持一致。 React 里&#xff0c;只需更新组件的 state&#xff0c;然后根据新的 state 重新渲染用…

运行在浏览器中的Domino Designer开发客户机

大家好&#xff0c;才是真的好。 首先讨论一个非常有意思的事情&#xff0c;就是有人问&#xff0c;如果我用很老的Lotus软件&#xff0c;它是免费的吗&#xff1f; 这估计代表了很多盆友的心声。但不太友好的是&#xff0c;即使你用很老的Lotus软件&#xff08;例如Notes R4…

百度搜索逐步恢复优质网站权限

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 从9月25日开始&#xff0c;有越来越多的站长和卢松松反馈&#xff0c;说他们的站可以正常入驻百度搜索资源平台了。我也试了试卢松松博客&#xff0c;果然&#xff0c;可以正常提交了。还是以前的…

Redis 线程模式

Redis 是单线程吗&#xff1f; Redis 单线程指的是 [接收客户端请求 -> 解析请求 -> 进行数据读写操作 -> 发送数据给客户端] 这个过程是由一个线程 (主线程) 来完成的&#xff0c;这也是常说的 Redis 是单线程的原因。 但是 &#xff0c;Redis 程序不是单线程的&am…