集群聊天服务器项目【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就行:

cpp 复制代码
#include "json.hpp"
using json = nlohmann::json;  //起个简单命名

3.1Json序列化

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

cpp 复制代码
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;
}

其中值可以存任意类型:

cpp 复制代码
string func2()
{
    json js;
    // 添加数组
    js["id"] = {1, 2, 3, 4, 5};
    // 添加key-value
    js["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();
}

值可以是容器:

cpp 复制代码
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容器),然后再通过键取值。

cpp 复制代码
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对象,再通过键去取对应的值。

注意:键必须是字符串(双引号括起来)

相关推荐
阿巴~阿巴~1 分钟前
深入解析IP分片:从原理到现代实践的全面指南
运维·服务器·网络·网络协议·tcp/ip·ip
迷途之人不知返7 分钟前
C++初识
c++
leiming67 分钟前
c++qt开发第三天 摄像头采集视频
开发语言·c++·qt
烛衔溟10 分钟前
C语言并发编程:Windows线程
c语言·c++·windows·性能优化·多线程·并发编程·线程同步
阿巴~阿巴~10 分钟前
IPv4地址的边界与智慧:特殊用途、枯竭挑战与应对策略全景解析
运维·服务器·网络·网络协议·tcp/ip·ipv4·ipv4地址枯竭
im_AMBER11 分钟前
Leetcode 97 移除链表元素
c++·笔记·学习·算法·leetcode·链表
开开心心就好13 分钟前
系统清理工具清理缓存日志,启动卸载管理
linux·运维·服务器·神经网络·cnn·pdf·1024程序员节
海奥华214 分钟前
Golang Channel 原理深度解析
服务器·开发语言·网络·数据结构·算法·golang
MindCareers15 分钟前
Beta Sprint Day 5-6: Android Development Improvement + UI Fixes
android·c++·git·sql·ui·visual studio·sprint
希赛网24 分钟前
网工备考,华为ENSP基础配置命令
服务器·网络·网络工程师·华为认证·命令行·ensp命令·网工备考