当前位置: 首页 > news >正文

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;}}

运行结果:

相关文章:

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

RapidJSON是腾讯开源的一个高效的C JSON解析器及生成器&#xff0c;它是只有头文件的C库&#xff0c;综合性能是最好的。 1. 安装 在NuGet中为项目安装tencent.rapidjson 2. 引用头文件 #include <rapidjson/document.h> #include <rapidjson/memorystream.h> #…...

4.迭代最近点ICP及非线性优化求解

使用非线性优化方法求解ICP 文章目录 使用非线性优化方法求解ICP前情提要ICP问题回顾对矩阵变量求导数 ICP问题的非线性解法代码示例 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 前情提要 在迭代最近点算法ICP及SVD求解中介绍了ICP问…...

【redis总结】

文章目录 1、redis简介2、为什么要选择redis做缓存3、数据结构4、redis多线程模型redis6.0的变化 5、redis持久化AOF的实现过程RDB的实现过程 6、redis集群的搭建7、 redis过期删除和淘汰策略8、redis的内存淘汰策略 1、redis简介 Redis&#xff08;Remote Dictionary Server&…...

图数据库:释放关系的力量

【squids.cn】 全网zui低价RDS&#xff0c;免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 在数据管理领域&#xff0c;图数据库已经成为一种强大的工具&#xff0c;它彻底改变了我们处理和分析复杂关系的方式。与依赖表和列的传统关系数据库不同&#xff0c;图…...

Windows系统如何临时关闭“Windows安全中心实时保护”

前言 启动windows depender实时保护可能会使系统不太流畅&#xff0c;也可能会导致我们的程序无法正常运行&#xff0c;因为它会拦截或搜索我们的正常工作。 暂时关闭windows depender的实时保护对许多用户来说非常重要。 一、Win10系统关闭方法 打开Windows安全中心&#…...

二叉树MFC实现

设有一颗二叉树如下&#xff1b; 这似乎是一颗经常用作示例的二叉树&#xff1b; 对树进行遍历的结果是&#xff0c; 先序为&#xff1a;3、2、2、3、8、6、5、4&#xff0c; 中序为&#xff1a;2、2、3、3、4、5、6、8&#xff0c; 后序为2、3、2、4、5、6、8、3&#xff1b…...

Nginx之客户并发数限制解读

目录 基本介绍 配置指令 limit_conn_zone limit_conn 其他 limit_rate limit_rate_after limit_req_zone limit_req 基本介绍 在我们进行系统开发设计中&#xff0c;要考虑服务器流量异常&#xff0c;负载过大等问题。对于大流量恶意的攻击访问&#xff0c;会带来带宽…...

白捡一个存储型XSS

本文由掌控安全学院 - 杳若 投稿 起因 利用fofa搜索时发现 org"China Education and Research Network Center" && body"/register" 任意用户注册 在找到该CMS的时候发现存在任意用户注册的情况 http://xxxx.edu.cn/student/Register.ashx …...

SpringMVC 学习(五)转发,重定向和传参

6. 转发和重定向 Spring MVC 的底层是 servlet&#xff0c;因此在 Spring MVC 中也存在转发和重定向的概念。 对于转发而言&#xff0c;其目的页面可以在 WEB-INF 目录下。重定向的目的页面不允许在 WEB-INF 目录下&#xff0c;因为重定向相当于用户再次发起一次请求&#xf…...

selenium不定位元素直接使用键盘操作(如弹框操作)

今天在使用selenium进行定位时&#xff0c;发现直接定位不了chrome的弹框&#xff0c;如这种弹框&#xff1a; 使用的是下面这行代码 driver.switch_to.alert.accept() 运行报错&#xff0c;说是没有 alert windown。。。。 啊&#xff1f;难道chrome的弹框不是用alert写的&…...

Inno Setup安装中文语言

以版本6.2.2为例&#xff1a; 默认安装的Inno Setup是不支持中文语言的&#xff0c;需要我们自行下载安装。 一、打开官网Inno Setup Translations (jrsoftware.org) 下载的文件如下 二、然后重命名放到Inno Setup的如下安装目录中 三、然后重启Inno Setup即可。 打包后的…...

【数据库——MySQL】(10)视图和索引

目录 1. 视图1.1 创建视图1.2 查询视图 2. 索引2.1 索引的分类2.2 索引的建立 参考书籍 1. 视图 1.1 创建视图 基础语法&#xff1a; CREATE [OR REPLACE] VIEW 视图名[(列名表)]ASSELECT语句[WITH CHECK OPTION]说明&#xff1a; 在默认情况下&#xff0c;将在当前数据库创…...

No servers available for service: renren…。 Gateway 网关报503错误 ,已解决

目录 环境配置问题描述loadbalancer的作用 环境配置 问题描述 配置spring cloud gateway使用端口访问就可以&#xff0c;使用lb:// 就报503 gateway:routes:- id: admin_routeuri: lb://gulimall-admin # uri: http://localhost:8080predicates:- Path/api/**filter…...

【Spring Cloud】深入理解 Eureka 注册中心的原理、服务的注册与发现

文章目录 前言一、微服务调用出现的问题1.1 服务消费者如何获取服务提供者的地址信息&#xff1f;1.2 如果有多个服务提供者&#xff0c;消费者该如何选择&#xff1f;1.3 消费者如何得知服务提供者的健康状态&#xff1f; 二、什么是 Eureka2.1 Eureka 的核心概念2.2 Eureka 的…...

添加路径到头文件默认搜索路径

在linux环境下写代码&#xff0c;出现函数是从其他文件引用的&#xff0c;需要把该文件的搜索路径添加到当前文件。 注意&#xff0c;除非必要&#xff0c;一般不建议这样做。比较好的方式是写入到CMakeLists或者Makefile中。 一次性生效&#xff0c;命令行输入即可&#xff…...

掌动智能:替代JMeter的压力测试工具有哪些

JMeter是一个广泛使用的开源压力测试工具&#xff0c;但在实际应用中&#xff0c;也有一些其他优秀的替代品可供选择。本文将介绍几个可替代JMeter的压力测试工具&#xff0c;它们在功能、性能和易用性方面都具有独特优势&#xff0c;可以满足不同压力测试需求的选择。 一、Gat…...

Casper Network 构建企业级区块链生态的野望

Casper Network 是基于 Layer1 且图灵完备 Wasm 的智能合约平台&#xff0c;它由唯一可操作的 CBC-Casper Proof-of-Stake (PoS) 共识算法&#xff08;称为 Highway&#xff09;支持&#xff0c;该网络是一个无需许可、去中心化的公共区块链。 Casper Network 主网在 2021 年 4…...

TiDB 7.1.0 LTS 特性解读丨关于资源管控 (Resource Control) 应该知道的 6 件事

TiDB 7.1.0 LTS 在前段时间发布&#xff0c;相信很多同学都已经抢先使用了起来&#xff0c;甚至都已然经过一系列验证推向了生产环境。面对 TiDB 7.1 若干重要特性&#xff0c;新 GA 的资源管控 (Resource Control) 是必须要充分理解、测试的一个重量级特性。对于常年奋斗在一线…...

Django Web开发入门基础

官方有很详细的文档&#xff0c;但是看过几遍之后如果要翻找还是有点麻烦&#xff0c;本文算作是学习笔记&#xff0c;提取一些关键点记录下来&#xff0c;另附上官方教程 编写你的第一个 Django 应用 注&#xff1a; 文中的指令使用py&#xff0c;是在Windows上&#xff0c;ma…...

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切(ROI)功能(C#)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切&#xff08;ROI&#xff09;功能&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的图像剪切&#xff08;ROI&#xff09;功能的技术背景CameraExplorer如何使用图像剪切&#xff08;ROI&#xff09;功…...

LetCode算法题---第2天

注:大佬解答来自LetCode官方题解 80.删除有序数组的重复项Ⅱ 1.题目 2.个人解答 var removeDuplicates function (nums) {let res [];for (let index 0; index < nums.length; index) {let num 0;if (res.includes(nums[index])) {for (let i 0; i < res.length; …...

Leetcode.2571 将整数减少到零需要的最少操作数

题目链接 Leetcode.2571 将整数减少到零需要的最少操作数 rating : 1649 题目描述 给你一个正整数 n n n &#xff0c;你可以执行下述操作 任意 次&#xff1a; n n n 加上或减去 2 2 2 的某个 幂 返回使 n n n 等于 0 0 0 需要执行的 最少 操作数。 如果 x 2 i x 2^…...

微前端无界 项目使用记录

1预期目标和场景 一个vue框架开发的应用&#xff0c;需要使用另一个系统的页面。 通俗来说&#xff0c;就是在一个web应用中独立的运行另一个web应用 2 技术支持 微前端处理方案&#xff1a;无界 无界官网&#xff1a; https://wujie-micro.github.io/doc/guide/ CSDN 参考…...

CDH 6.3.2升级Flink到1.17.1版本

CDH&#xff1a;6.3.2 原来的Flink&#xff1a;1.12 要升级的Flink&#xff1a;1.17.1 操作系统&#xff1a;CentOS Linux 7 一、Flink1.17编译 build.sh文件&#xff1a; #!/bin/bash set -x set -e set -vFLINK_URLsed /^FLINK_URL/!d;s/.*// flink-parcel.properties FLI…...

基于谷歌Transeformer构建人工智能问答系统

目录 1 项目背景 2 关键技术 2.1 Transeformer模型 2.2 Milvus向量数据库 3 系统代码实现 3.1 运行环境构建 3.2 数据集介绍 3.3 预训练模型下载 3.4 代码实现 3.4.1 创建向量表和索引 3.4.2 构建向量编码模型 3.4.3 数据向量化与加载 3.4.4 构建检索web 3.5 运行结…...

【2023年11月第四版教材】第15章《风险管理》(合集篇)

第15章《风险管理》&#xff08;合集篇&#xff09; 1 章节说明2 管理基础2.1 风险的属性2.2 风险的分类★★★2.3 风险成本★★★2.4 管理新实践 3 管理过程4 管理ITTO汇总★★★5 过程1-规划风险管理6 过程2-识别风险6.1 识别风险★★★6.2 数据收集★★★6.3 数据分析★★★…...

python常见面试题四

解释 Python 中的魔术方法 (magic methods)。 答&#xff1a;魔术方法是以双下划线 __ 开头和结尾的方法&#xff0c;用于在特定条件下自动调用。例如&#xff0c;__init__ 是用于初始化对象的魔术方法。 解释 Python 中的装饰器 (decorator)。 答&#xff1a;装饰器是一种特殊…...

stm32无人机-飞行力学原理

惯性导航&#xff0c;是一种无源导航&#xff0c;不需要向外部辐射或接收信号源&#xff0c;就能自主进行确定自己在什么地方的一种导航方法。 惯性导航主要由惯性器件计算实现&#xff0c;惯性器件包括陀螺仪和加速度计。一般来说&#xff0c;惯性器件与导航物体固连&#xf…...

Java括号匹配

目录 一、题目描述 二、题解 一、题目描述 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭…...

自动化测试-友好的第三方库

目录 mock furl coverage deepdiff pandas jsonpath 自动化测试脚本开发中&#xff0c;总是会遇到各种数据处理&#xff0c;例如MOCK、URL处理、JSON数据处理、结果断言等&#xff0c;也会遇到所采用的测试框架不能满足当前需求&#xff0c;这些问题都需要我们自己动手解…...

南宁网站建设电话/学网络运营需要多少钱

共2页 第 页1 2015—2016学年第二学期期中考试卷考试课程《常用工具软件》 专业 信息技术类 命题人 XXX(答题时间 90 分钟)一、选择题( 每小题2分&#xff0c;共40分)注意&#xff1a;只有将答案写在下面表格内才能得分)1、使用PartitionMagic 创建新分区时&#xff0c;默认的文…...

西青做网站的公司/百度网页版登录

新建库: create database 库名;删除库: drop database 库名;使用数据库: use 库名;展示所有库: show databases;查看当前库名: select database();创建表格: create table显示数据库下所有数据表:show tables显示数据表结构:desc 表名对数据表进行重命名:rename 表名 to 新表名…...

河南省交通基本建设质量检测监督站网站/付费推广方式有哪些

css实现固定背景图像的方法发布时间&#xff1a;2020-08-29 11:26:59来源&#xff1a;亿速云阅读&#xff1a;81作者&#xff1a;小新小编给大家分享一下css实现固定背景图像的方法&#xff0c;相信大部分人都还不怎么了解&#xff0c;因此分享这篇文章给大家参考一下&#xff…...

wordpress中文版源码/seo咨询解决方案

目录 EFK架构&#xff08;elasticsearch\filebeat\kibana&#xff09; 1、下载elasticsearch、kibana、filebeat 2、创建用户并授权 3、安装并启动 3.1 使用elasticsearch账号安装启动 >3.1.1 解压 elasticsearch >3.1.2 配置 elasticsearch >3.1.3 启动elast…...

公司招聘一个网站建设来做推广/财经新闻最新消息

【2017cs231n】课程笔记01&#xff1a;计算机视觉概述及历史背景 搜索微信公众号:‘AI-ming3526’或者’计算机视觉这件小事’ 获取更多算法、机器学习干货 csdn&#xff1a;https://blog.csdn.net/baidu_31657889/ github&#xff1a;https://github.com/aimi-cn/AILearners 课…...

有用模板网在线制作免费网站/杭州seo搜索引擎优化公司

前言 千万级大表如何优化&#xff0c;这是一个很有技术含量的问题&#xff0c;通常我们的直觉思维都会跳转到拆分或者数据分区。除此之外&#xff0c;还有其他的思路和解决方案。根据本人多年的工作经验&#xff0c;做了如下总结。 方案 "千万级大表优化"这句话有…...