集群聊天服务器项目【C++】(二)Json的简单使用

在上一章中,简单介绍了本项目的内容、技术栈、需求和目标等,详细介绍了环境配置,如果还没有配置成功,请参考我的上一篇博客环境配置

今天主要介绍Json库是什么以及简单的使用。

1.为什么要使用Json

我们在网络传输数据时,可能两端的操作系统或者所使用的语言不同,相互转化存在困难,因此我们需要使用序列化的手段,将要发送的数据转成通信双方都能处理的格式,比如XML、Json、protoBuf等,然后接收方再反序列化出发送的消息。

2.Json库简单介绍

Json是一种轻量级的数据交换格式(也叫数据序列化方式)。Json采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 Json 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在网络传输中,一般有3中常见的序列化格式:XML,Json、ProtoBuf

  1. ProtoBuf:数据压缩编码传输,占用带宽小,复杂
  2. Json:相比与ProtoBuf更简单,但性能差一点
  3. XML:性能差
    本项目使用Json完成网络数据的序列化与反序列化。

3. Json的简单使用

我们可以直接使用大牛写好的一个Json库,它只有一个hpp文件,因此使用它只需要include就行:

#include "json.hpp"
using json = nlohmann::json;  //起个简单命名

3.1Json序列化

将Json看成一个无序的容器,类似unordered_map一样以键值对存储。其中键一定要用双引号括起来,值无所谓,可以是任意的类型。使用js.dump(): json数据对象序列化为 json字符串,然后发送。

string func1()
{json js;   //看成定义js容器js["msg_type"] = 2;   //看成键值对,值必须双引号括起来,看成字符串,值可以是任意类型js["from"] = "zhang san";js["to"] = "li si";js["msg"] = "hello, what are you doing now?";cout << js << endl;  //{"from":"zhang san","msg":"hello, what are you doing now?","msg_type":2,"to":"li si"}string sendBuf = js.dump();  //转成Json字符串类型输出cout<<sendBuf.c_str()<<endl; //{"from":"zhang san","msg":"hello, what are you doing now?","msg_type":2,"to":"li si"}return sendBuf;
}

其中值可以存任意类型:

string 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; //输出{"from":"zhang san","msg":"hello, what are you doing now?","msg_type":2,"to":"li si"}return js.dump();
}

值可以是容器:

string 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; //{"list":[1,2,5],"path":[[1,"黄山"],[2,"华山"],[3,"泰山"]]}return sendBuf;
}

3.2Json反序列化

数据反序列化json::parse(Json字符串):Json字符串反序列化Json数据对象(看成unordered_map容器),然后再通过键取值。

string recvBuf = func1();
// 数据的反序列化   json字符串 =》反序列化 数据对象(看作容器,方便访问)
json jsbuf = json::parse(recvBuf);
cout<<jsbuf["msg_type"]<<endl;  //2
cout<<jsbuf["from"]<<endl;   //"zhang san"
cout<<jsbuf["to"]<<endl;   //"li si"
cout<<jsbuf["msg"]<<endl;   //"hello, what are you doing now?"

总结

本文讲解了为什么需要使用Json库,什么是Json库,以及Json库的简单使用方法。其中Json可以看成一个unordered_map容器取使用。
在序列化时,使用Json js创建一个json对象,按键值对的方式添加元素,使用js.dump()转成Json字符串,然后发送。
接收方收到Json字符串后需要反序列化,使用Json::parse()将Json字符串转为js对象,再通过键去取对应的值。
注意:键必须是字符串(双引号括起来)

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

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

相关文章

判断当前环境是否为docker容器下

判断当前环境是否为docker容器下 webshell后或登录到系统后台&#xff0c;判断是否为docker容器可使用如下方法&#xff1a; 方式一&#xff1a;使用ls -alh命令查看是否存在.dockerenv来判断是否在docker容器环境内 ls -alh /.dockerenv如下图无.dockerenv文件&#xff0c;所…

本地部署轻量级web开发框架Flask结合内网穿透公网环境访问管理界面

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架&#xff0c;采用Python编程语…

无人机飞手教员组装、调试高级教学详解

随着无人机技术的飞速发展&#xff0c;其在航拍、农业、救援、监测等多个领域的应用日益广泛&#xff0c;对专业无人机飞手的需求也随之增加。作为无人机飞手教员&#xff0c;掌握无人机的高级组装、调试技能不仅是教学的基础&#xff0c;更是培养学生成为行业精英的关键。本教…

【吊打面试官系列-Redis面试题】使用过 Redis 做异步队列么,你是怎么用的?

大家好&#xff0c;我是锋哥。今天分享关于【使用过 Redis 做异步队列么&#xff0c;你是怎么用的&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 使用过 Redis 做异步队列么&#xff0c;你是怎么用的&#xff1f; 一般使用 list 结构作为队列&#xff0c;rpus…

Word中插入当前日期与时间

Word中插入当前日期与时间 通过构建基块的方法快速插入当前日期与时间 快捷键操作 快捷键具体功能说明 Alt Shift D 插入当前日期date Alt Shift T 插如当前时间time Ctrl Shift F9 使得域文本变为正常文本 Ctrl F11 锁定域更新域菜单工具会变为黑色 C…

你的大模型应用表现真的好吗?借助 Dify + Langfuse 一探究竟

背景介绍 众所周知&#xff0c;大模型应用的输出存在着一些不确定性&#xff0c;往往需要迭代多轮才能得到较为稳定的输出结果&#xff0c;因此开发者往往需要关注大模型应用的实际表现&#xff0c;并进行有针对性的优化。 然而常规 Web 服务的监控机制往往无法满足大模型应用…

python绘制3d建筑

import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d.art3d import Poly3DCollection# 随机生成建筑块数据 def generate_building_blocks(num_blocks, grid_size100, height_range(5, 50), base_size_range(10, 30)):buildings []for _ in range(…

sqli-labs靶场自动化利用工具——第1关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生&#xff0c;或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢&#xff1f;可能有些人会说不是有sqlmap&#xf…

中国矿业大学《2023年868+2007年自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《25届中国矿业大学868自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2007年复试真题 2023年初试真题 Part1&#xff1a;完整版真题 2007年复试真题 2…

【Python基础】Python错误和异常处理(详细实例)

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、Python中的错误类型三、Python异常处理机制3.1 try-except语句3.2 try-except-else语句3.3 try-fi…

TiDB 扩容过程中 PD 生成调度的原理及常见问题丨TiDB 扩缩容指南(一)

导读 作为一个分布式数据库&#xff0c;扩缩容是 TiDB 集群最常见的运维操作之一。本系列文章&#xff0c;我们将基于 v7.5.0 具体介绍扩缩容操作的具体原理、相关配置及常见问题的排查。 通常&#xff0c;我们根据当前资源状态来决定是否需要调整 TiKV 节点的规模&#xff0…

探索螺钉设计:部分螺纹与全螺纹,哪种更适合你的项目?

为什么有些螺钉有部分螺纹? 螺钉由头部、柄部和尖端组成&#xff0c;是世界上zui常用的紧固件之一。与螺栓一样&#xff0c;它们旨在将多个对象或表面连接在一起。但是&#xff0c;在比较不同类型的螺钉时&#xff0c;您可能会注意到其中一些都具有部分螺纹杆。 什么是螺柄&a…

Python | Leetcode Python题解之第397题整数替换

题目&#xff1a; 题解&#xff1a; class Solution:def integerReplacement(self, n: int) -> int:ans 0while n ! 1:if n % 2 0:ans 1n // 2elif n % 4 1:ans 2n // 2else:if n 3:ans 2n 1else:ans 2n n // 2 1return ans

Python_两个jpg图片文件名称互换

项目场景 处理Adobe Photoshop导出的两个切片的顺序错误问题 小编在进行图片切片处理的时候&#xff0c;发现用PS导出的切片顺序错误&#xff0c;例如用PS导出的切片分别为test_01.jpg&#xff0c;test_02.jpg&#xff0c;但实际的使用需求是将两个图片的顺序调换&#xff0c…

self-play RL学习笔记

让AI用随机的路径尝试新的任务&#xff0c;如果效果超预期&#xff0c;那就更新神经网络的权重&#xff0c;使得AI记住多使用这个成功的事件&#xff0c;再开始下一次的尝试。——llya Sutskever 这两天炸裂朋友圈的OpenAI草莓大模型o1和此前代码能力大幅升级的Claude 3.5&…

基于less和scss 循环生成css

效果 一、less代码 复制代码 item-count: 12; // 生成多少个 .item 类.item-loop(n) when (n > 0) {.icon{n} {background: url(../../assets/images/menu/icon{n}.png) no-repeat;background-size: 100% 100%;}.item-loop(n - 1);}.item-loop(item-count);二、scss代码 f…

【人工智能】Transformers之Pipeline(十七):文本分类(text-classification)

目录 一、引言 二、文本分类&#xff08;text-classification&#xff09; 2.1 概述 2.2 DistilBERT—BERT 的精简版&#xff1a;更小、更快、更便宜、更轻便 2.3 应用场景​​​​​​​ 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 …

【Hot100】LeetCode—287. 寻找重复数

目录 1- 思路题目识别快慢指针-类比链表判环 2- 实现⭐31. 下一个排列——题解思路 3- ACM 实现 原题链接&#xff1a;287. 寻找重复数 1- 思路 题目识别 识别1 &#xff1a;给定一个数组&#xff0c;寻找数组中的重复数。必须用 O(1) 的空间复杂度&#xff0c;且不能修改数组…

VMware Fusion Pro 13 Mac版虚拟机 安装Win11系统教程

Mac分享吧 文章目录 Win11安装完成&#xff0c;软件打开效果一、VMware安装Windows11虚拟机1️⃣&#xff1a;准备镜像2️⃣&#xff1a;创建虚拟机3️⃣&#xff1a;虚拟机设置4️⃣&#xff1a;安装虚拟机5️⃣&#xff1a;解决连不上网问题 安装完成&#xff01;&#xff0…

fuxa搭建与使用(web组态)

1. 安装Node.js -> npm安装 参考网址&#xff1a;https://blog.csdn.net/WHF__/article/details/129362462 一、安装运行 C:\WINDOWS\system32>node -v v20.17.0 C:\WINDOWS\system32>npm -v 10.8.2 二、环境配置 在安装路径&#xff08;D:\Program_Files\nodejs&a…