做网站能接到模具单吗,58同城广告推广电话,亚马逊免费视频,做进口产品的网站好在上一章中#xff0c;简单介绍了本项目的内容、技术栈、需求和目标等#xff0c;详细介绍了环境配置#xff0c;如果还没有配置成功#xff0c;请参考我的上一篇博客环境配置
今天主要介绍Json库是什么以及简单的使用。
1.为什么要使用Json
我们在网络传输数据时#…在上一章中简单介绍了本项目的内容、技术栈、需求和目标等详细介绍了环境配置如果还没有配置成功请参考我的上一篇博客环境配置
今天主要介绍Json库是什么以及简单的使用。
1.为什么要使用Json
我们在网络传输数据时可能两端的操作系统或者所使用的语言不同相互转化存在困难因此我们需要使用序列化的手段将要发送的数据转成通信双方都能处理的格式比如XML、Json、protoBuf等然后接收方再反序列化出发送的消息。
2.Json库简单介绍
Json是一种轻量级的数据交换格式也叫数据序列化方式。Json采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 Json 成为理想的数据交换语言。 易于人阅读和编写同时也易于机器解析和生成并有效地提升网络传输效率。 在网络传输中一般有3中常见的序列化格式XMLJson、ProtoBuf
ProtoBuf数据压缩编码传输占用带宽小复杂Json相比与ProtoBuf更简单但性能差一点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字符串类型输出coutsendBuf.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容器vectorint vec;vec.push_back(1);vec.push_back(2);vec.push_back(5);js[list] vec;// 直接序列化一个map容器mapint, string m;m.insert({1, 黄山});m.insert({2, 华山});m.insert({3, 泰山});js[path] m;string sendBuf js.dump(); // json数据对象 》序列化 json字符串coutsendBufendl; //{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);
coutjsbuf[msg_type]endl; //2
coutjsbuf[from]endl; //zhang san
coutjsbuf[to]endl; //li si
coutjsbuf[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对象再通过键去取对应的值。 注意键必须是字符串双引号括起来