今天继续来更新C++集群聊天服务器项目,如果还有未搭建环境的小伙伴可以移步我的上一篇博客,指路C++项目——集群聊天服务器项目(一)项目介绍、环境搭建、Boost库安装、Muduo库安装、Linux与vscode配置-CSDN博客
这里包含项目所需的必要环境。
今天介绍Json第三方库的使用,主要是实现服务端与客户端间通信数据的序列化与反序列化,一起来看看吧~课程资源可以看【高级】C++项目-集群聊天服务器-软件分层设计和高性能服务开发_吾爱学堂 (yuerxuetang.com)
一、Json介绍
在网络中,常用的数据传输序列化格式有XML,Json,ProtoBuf
在公司级别的项目中=大量的在使用 ProtoBuf作为数据序列化的方式,但是使用起来比Json稍复杂一些
数据的序列化方式可选择:Json、XML、Protobuf
Json是一种轻量级的数据交换格式(也叫数据序列化方式)。
Json采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 Json 成为理想的数据交换语言。
易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
二、第三方库Json.hpp
JSON for Modern C++ 是一个由德国大牛 nlohmann 编写的在 C++ 下使用的 JSON 库。
特点:
(1)直观的语法
(2)整个代码由一个头文件组成 json.hpp,没有子项目,没有依赖关系,没有复杂的构建系统,使用起来非常方便
(3)使用 C++ 11 标准编写
(4)使用 json 像使用 STL 容器一样
(5)STL 和 json 容器之间可以相互转换
(6)严谨的测试:所有类都经过严格的单元测试,覆盖了 100% 的代码,包括所有特殊的行为。此 外,还检查了 Valgrind 是否有内存泄漏。为了保持高质量,该项目遵循核心基础设施倡议(CII) 的最佳实践
使用方法:
#include "json.hpp"
using json = nlohmann::json;
三、Json序列化实例
3.1 序列化实例1
string func1(){
json js;
js["Msg_Type"]=2;
js["From"]="Zhang San";
js["To"]="Li Si";
js["Message"]="Hey, BaBy!";
string sendBuf = js.dump(); //转成字符串通过网络发送
return sendBuf;
}
输出结果:
3.2 序列化实例2
string func2(){
json js;
//添加数组
js["id"]={1,2,3,4,5};
//添加键值对
js["name"]="Zhang San";
//添加对象
js["msg"]={{"Zhang san","Hello World!"},{"Li Si","Hello China!"}};
return js.dump();
}
输出结果:
3.3 序列化实例3
string func3(){
json js;
//序列化一个vector容器
vector<int>v;
v.push_back(1);
v.push_back(2);
v.push_back(5);
js["list"]=v;
//序列化一个map容器
map<int,string>m;
m.insert(make_pair(1,"黄山"));
m.insert(make_pair(2,"华山"));
m.insert(make_pair(3,"嵩山"));
js["path"]=m;
string SendBuf = js.dump(); //json数据对象->序列化 json字符串
return SendBuf;
}
输出结果:
四、Json反序列化实例
4.1 反序列化实例1
string recBuf = func1();
json jsbuf=json::parse(recBuf); //数据的反序列化 json字符串->json对象
cout << jsbuf["Msg_Type"] << endl;
cout << jsbuf["From"] << endl;
cout << jsbuf["To"] << endl;
cout << jsbuf["Message"] << endl;
输出:
4.2 反序列化实例2
string recBuf = func2();
json jsbuf=json::parse(recBuf); //数据的反序列化 json字符串->json对象
auto arr=jsbuf["id"];
cout << arr[2] << endl;
auto jsmsg=jsbuf["msg"];
cout << jsmsg["Zhang san"] << endl;
cout << jsmsg["Li Si"] << endl;
输出:
4.3 反序列化实例3
string recBuf = func3();
json jsbuf=json::parse(recBuf); //数据的反序列化 json字符串->json对象
vector<int> vec = jsbuf ["list"];
for(int &v:vec){
cout << v << " ";
}
cout << endl;
map<int,string> mymap=jsbuf["path"];
for(auto &p:mymap){
cout << p.first << " " << p.second << endl;
}
输出结果:
Json学习结束,如果有问题还请及时联系我~