【C++集群聊天服务器(二)】|json简单入门

Json是一种轻量级的数据交换格式(也叫数据序列化方式)。

也就是说,我们在数据的传输上其实已经被序列化了,等发到服务器或者是发到客户端的时候,我们需要把它反序列化成json。

json长什么样子可以直接去百度即可。

在网络中,常用的数据传输序列化格式有XML,Json,ProtoBuf,在公司级别的项目中,大量的在使用 ProtoBuf作为数据序列化的方式,以其数据压缩编码传输,占用带宽小,同样的数据信息,是Json的 1/10,XML的1/20,但是使用起来比Json稍复杂一些,所以项目中我们选择常用的Json格式来打包传输 数据。

Json第三方库

JSON for Modern C++ 是一个由德国大牛 nlohmann 编写的在 C++ 下使用的 JSON 库。

具有以下特点

  • 直观的语法

  • 整个代码由一个头文件组成 json.hpp,没有子项目,没有依赖关系,没有复杂的构建系统,使用 起来非常方便

  • 使用 C++ 11 标准编写

  • 使用 json 像使用 STL 容器一样

  • STL 和 json 容器之间可以相互转换

  • 严谨的测试:所有类都经过严格的单元测试,覆盖了 100% 的代码,包括所有特殊的行为。此 外,还检查了 Valgrind 是否有内存泄漏。为了保持高质量,该项目遵循核心基础设施倡议(CII) 的最佳实践

使用的时候,我们这样即可:

#include "json.hpp" 
using json = nlohmann::json;

Json数据序列化

就是把我们想要打包的数据,或者对象,直接处理成Json字符串。简单理解,json字符串就是由大括号括起来的键值对。和我们C++里面的无序关联容器比较像,其实它底层就是使用链式哈希表进行存储。

案例一:Json完成字符串的序列化

#include "json.hpp"
using json = nlohmann::json;#include <iostream>
using namespace std;//json序列化实例1
void func1() {json js;//想要组装的数据格式js["msg_type"] = 2;js["from"] = "zhang san";js["to"] = "li si";js["msg"] = "hello, what are you doing now?";//直接被序列化成一个jscout << js << endl;
}int main () {func1();return 0;
}

打印效果如下:

{"from":"zhang san","msg":"hello, what are you doing now?","msg_type":2,"to":"li si"}

我们要注意他的存储是无序的,并不是说我第一个插msg_type,第一个显示的就是msg_type

我现在想把Json字符串通过网络发送出去,我肯定要把它转成字符串类型,那么怎么把Json类型里面包含的Json字符串(序列化后的数据)转换为字符串进行发送呢?

案例二:将Json字符串转换为std::string

#include <string>
string sendBuf = js.dump();
cout << sendBuf.c_str << endl;

如果我们通过网络传输,肯定是吧 string 转换成 char*。
最后打印输出的结果和上面是一样的。

案例二:序列化

他可以序列化更加复杂的内容,

首先其中的key对应的 value 本身可以是普通的类型,也可以是字符串类型,甚至可以是数组类型。

void func2() {json js; // 添加数组js["id"] = {1,2,3,4,5};// 添加key-valuejs["name"] = "zhang san";// 添加对象js["msg"]["zhang san"] = "hello world";js["msg"]["liu shuo"] = "hello china";// 上面等同于下面这句一次性添加数组对象js["msg"] = {{"zhang san", "hello world"}, {"liu shuo", "hello china"}};cout << js << endl;
}

如何理解:

    js["msg"]["zhang san"] = "hello world";js["msg"]["liu shuo"] = "hello china"

也就是说我们的 js["msg"] 字符串仍然是一个 Json字符串,所以我们还可以访问 js["msg"] 它的 key 和 value : js["msg"]["zhang san"]

也就是说某个键的值可以是任何类型。

案例三:序列化容器

这是Json非常强大的功能,它可以直接序列化容器。

在以下示例中,他直接序列化容器 vector 和 map:

void func3() {json js;// 直接序列化一个vector容器vector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(5);js["list"] = vec;// 直接序列化一个map容器map<int, string> m;m.insert({1, "挺好的?"});m.insert({2, "华山"});m.insert({3, "泰山"});js["path"] = m;string sendBuf = js.dump(); // json数据对象 =》序列化 json字符串cout<<sendBuf<<endl;//return sendBuf;
}

打印结果如下:

{"list":[1,2,5],"path":[[1,"挺好的?"],[2,"华山"],[3,"泰山"]]}

这个序列化结果显示,Json吧 vector 直接序列化成了数组,把 map 序列化成了“数组里面套数组”。

现在我们把它进行序列化:

string sendBuf = js.dump(); //json数据对象=》序列化 json字符串
cout << sendBuf.c_str() << endl;

这样我们可以把它通过网络发送

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springCloud中将redis共用到common模块

一、 springCloud作为公共模块搭建框架 springCloud 微服务模块中将redis作为公共模块进行的搭建结构图&#xff0c;如下&#xff1a; 二、redis 公共模块的搭建框架 如上架构&#xff0c;代码如下pom.xml 关键代码&#xff1a; <dependencies><!-- SpringBoot Boo…

Thread Local六连问,你扛得住吗?

一、Thread Local 是什么? 线程本地变量。当使用ThreadLocal维护变量时&#xff0c;ThreadLocal为每个使用该变量的线程提供独立的变量副本&#xff0c;所以每个线程都可以独立地改变自己的副本&#xff0c;而不影响其他线程&#xff0c;做到了线程隔离。 二、Thread Local …

windows hash简介

一、hash简介 1、Windows系统使用两种方法对用户的密码进行哈希处理。它们分别是LAN Manager(LM)哈希和 NT LAN Manager(NTLM)哈希 2、所谓哈希(hash)&#xff0c;就是使用一种加密函数进行计算后的结果。这个加密函数对一个任意长度的 字符串数据进行一次数学加密函数运算…

电厂三维人员定位系统的应用与优势有哪些?

在电力行业的快速发展中&#xff0c;电厂的安全生产和管理显得尤为重要。近年来&#xff0c;随着信息技术的不断进步&#xff0c;电厂三维人员定位系统逐渐成为电厂安全管理的新利器。该系统利用三维技术&#xff0c;实现对电厂内部人员位置的实时监控与定位&#xff0c;大大提…

图像操作的基石Numpy

OpenCV中用到的矩阵都要转换成Numpy数组 Numpy是一个经高度优化的Python数值库 创建矩阵 检索与赋值[y,x] 获取子数组[:,:] 一 创建数组array() anp.array([2,3,4]) cnp.array([1.0,2.0],[3.0,4.0]]) import numpy as npanp.array([1,2,3])bnp.array([[1,2,3],[4,5,6]])pr…

主机加固的最后一米防护

智慧互联的浪潮正席卷全球&#xff0c;它不仅重塑了传统的工业格局&#xff0c;也催生了无数创新的商业模式。随着物联网和互联网技术的飞速发展&#xff0c;智能化、自动化、联网化已成为未来各个行业的发展方向。然而&#xff0c;智慧物联的开放性、系统的漏洞以及基于用户、…

初识JAVA中的包装类,时间复杂度及空间复杂度

目录&#xff1a; 一.包装类 二.时间复杂度 三.空间复杂度 一.包装类&#xff1a; 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java 给每个基本类型都对应了一个包装类型。 1 基本数据类型和对应的包装类 &am…

【Lua】IntelliJ IDEA 写注释或选中变量单词时偶尔会选中相邻的内容或下一行内容

例如: --UI代码local a 0 当你想在a变量上方加一行 --UI代码注释时&#xff0c;会发现敲打daima中文拼音时&#xff08;还未按回车&#xff09;就会选中当前行以及下一行前半部分。 打完按空格就会变成这样子&#xff01; 原因是因为开启了英文检测&#xff0c;需要关掉它。 …

一个http请求的前世今生

一个HTTP请求的“前世今生”可以被形象地描述为从发起请求到接收响应的整个生命周期。以下是这个过程的详细步骤&#xff1a; 用户输入URL&#xff1a; 用户在浏览器地址栏输入一个网址&#xff08;URL&#xff09;&#xff0c;这通常是一个网站的域名。 DNS解析&#xff1a;…

基于SVm和随机森林算法模型的中国黄金价格预测分析与研究

摘要 本研究基于回归模型&#xff0c;运用支持向量机&#xff08;SVM&#xff09;、决策树和随机森林算法&#xff0c;对中国黄金价格进行预测分析。通过历史黄金价格数据的分析和特征工程&#xff0c;建立了相应的预测模型&#xff0c;并利用SVM、决策树和随机森林算法进行训…

python_01

1、test # 方法1 不推荐使用&#xff0c;繁琐 # open("./1.txt",) # ./和不写&#xff0c;都代表从当前文件目录去找内容 file1 open(r".\1.txt","r",encoding"utf8") # "r" 读取 encoding"utf8" 设…

按按钮题解

推荐在 cnblogs 上阅读 按按钮题解 在量体温&#xff0c;打不了代码&#xff0c;来写题解。 赞美 lwq&#xff0c;三句话让我跟上了课堂节奏。 题意 数轴 n n n 个按钮&#xff0c;第 i i i 个按钮在坐标 i i i。有 m m m 次询问&#xff0c; i i i 询问为在时刻 t i…

英伟达驱动重装教程

离线安装NVIDIA驱动程序通常涉及下载驱动程序安装包并手动执行安装步骤。以下是详细步骤: 1. 下载NVIDIA驱动程序 首先,你需要在有网络连接的计算机上下载适合你系统的NVIDIA驱动程序安装包。可以从NVIDIA官方驱动下载页面下载。 选择你的GPU型号和操作系统,然后下载相应…

Gradio 案例——将文本文件转为词云图

文章目录 Gradio 案例——将文本文件转为词云图界面截图依赖安装项目目录结构代码 Gradio 案例——将文本文件转为词云图 利用 word_cloud 库&#xff0c;将文本文件转为词云图更完整、丰富的示例项目见 GitHub - AlionSSS/wordcloud-webui: The web UI for word_cloud(text t…

Python脚手架系列-PyQt5

记录PyQt模块使用中的一些常常复用的代码 其他 导入界面 import sysfrom PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QApplication, QMainWindow from UI.MainWindow import Ui_MainWindow # 导入UI界面的类以供继承class MyApp(QMainWindow, Ui_MainWindow):de…

网络数据库后端面试题

接着上期 8&#xff0c;索引是怎么提高查询效率的&#xff0c;是不是多越好 索引是数据库中用来提高查询效率的技术&#xff0c;类似目录。如果不使用索引&#xff0c;数据会零散的保存在磁盘中&#xff0c;查询数据需要挨个遍历每一个磁盘块&#xff0c;直到找到数据&#…

未来以来!鸿蒙生态爆发式增长,程序员新出路火速Get。

鸿蒙生态取得爆发式增长&#xff01; 鸿蒙生态建设速度突飞猛进&#xff0c;不仅有超4000款应用加速开发&#xff0c;众多头部SDK伙伴也在积极加入&#xff0c;为开发者提供构建鸿蒙原生应用所需的多项能力。近期&#xff0c;友盟移动统计SDK、神策数据SDK、阿里云日志服务SDK…

【Vue】v-bind对样式控制的增强-操作class

文章目录 一、语法二、示例代码三、京东秒杀-tab栏切换导航高亮四、v-bind对有样式控制的增强-操作style五、进度条案例 为了方便开发者进行样式控制&#xff0c; Vue 扩展了 v-bind 的语法&#xff0c;可以针对 class 类名 和 style 行内样式 进行控制 。 一、语法 语法 &l…

Latex中标注通讯作者

** 直接使用脚注&#xff0c;不用添加宏包 多个同地址的并列&#xff0c;建议加点空格&#xff0c;好看一些 ** \title{xxxxxxxxxxxxxxxxxxx}\author{xxxxxxxxxxxxxxxxxxx\footnote{Corresponding author} ,bbbbbbbbbbbbbbbbbbb}\address{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx…

免费,Scratch蓝桥杯比赛历年真题--第15届蓝桥杯STEMA真题-2024年3月份(含答案解析和代码)

第15届蓝桥杯STEMA真题-2024年3月份 一、单选题 答案&#xff1a;D 解析&#xff1a;y坐标正值表示上&#xff0c;负值表示下&#xff0c;故答案为D。 答案&#xff1a;C 解析&#xff1a;18<25为真&#xff0c;或关系表示一真即为真&#xff0c;故答案为C。 答案&#xff…