Json三方库介绍

devtools/2024/9/22 14:58:21/

目录

  • Json是干什么的
  • Json序列化代码
  • Json反序列化代码

Json是干什么的

Json是一种轻量级的数据交换格式,也叫做数据序列化方式。Json完全独立于编程语言的文本格式来存储和表述数据。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

现在常用的是protobuf(但是较难),它更高效。

比如我们想要发送消息:

msg_type: 2
from: xxx
to: xxx
msg: xxxxxxx

在这里插入图片描述

我们通过网络发送,协议如果是TCP,就是字节流(TCP是面向字节流的协议,UDP是面向报文的协议),所以我们要把这个消息结构想办法进行数据序列化,转换成字节流或者字符流,进行发送,发送到远端。

远端接收到字节流/字符流之后,上报给应用,应用从字节流/字符流反序列化成原来的消息结构。

Json序列化代码

JSON for Modern C++这个三方库地使用很简单,将Json.hpp拖入C++项目中

#include "json.hpp"
using json = nlohmann::json; // 给nlohuann作用域下地json重新起一个简单的名字json

可以序列化整型和字符型

void fun1()
{json js;js["mag_type"] = 2;js["from"]="zhang san";js["to"]="li si";js["msg"] = "hello, what are you doing now?";cout << js <<endl;
}

输出如下,就和链式哈希表一样,是无序的:

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

如果我们使用网络传输,传输的是char*,先将json转换成字符串,然后转换成char*。

string sendBuff = js.dump();  //dump()是json的内置函数,json数据对象 -> 序列化 json字符串
cout << sendBuff.c_str() <<endl;

这样的输出结果也是同样的

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

可以序列化的内容不只是整型或者字符串,还可以是一些其他的类型,比如可以序列化数组,甚至还可以是个json类型

void fun2(){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对象的序列化结果是:

{"id":[1,2,3,4,5],msg":{"liu shuo":"hello china","zhang san":"hello world"},"name":"zhang san"}

可以把json类似的看成一个map表,放键值对的,但是值的类型可以是不相同的。

还可以序列化容器

void fun3(){json js;//直接序列化一个vector容器vector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(3);js["list"] = vec;//序列化一个map容器map<int, string> m;m.insert({1, "huang"});m.insert({2, "lv"});m.insert({3, "hong"});js["path"] = m;cout << js << endl;
}

输出结果如下:

{"list":[1,2,3],"path":[[1,"huang"],[2,"lv"],[3,"hong"]]}

换成序列化后的json字符串输出还是一样的

string sendBuf = js.dump();
cout << sendBuf.c_str() << endl;-> {"list":[1,2,3],"path":[[1,"huang"],[2,"lv"],[3,"hong"]]}

Json反序列化代码

主要代码json jsbuf = json::parse(recvBuf);

反序列化fun1()

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

反序列化fun2()

string recvBuf = fun2();
//数据的反序列化  json字符串  ->  反序列化 数据对象(看作容器,方便访问)
json jsbuf = json::parse(recvBuf);
cout << jsbuf["id"] << endl;
auto arr = jsbuf["id"];
cout << arr[2] << endl;auto msgjs = jsbuf["msg"];
cout << msgjs["zhang san"] << endl;
cout << msgjs["liu shuo"] << endl;->  [1,2,3,4,5]3"hello world""hello china"

反序列化fun3()

string recvBuf = fun3();
//数据的反序列化  json字符串  ->  反序列化 数据对象(看作容器,方便访问)
json jsbuf = json::parse(recvBuf);
vector<int> vec = jsbuf["list"]; //json对象里面的数组类型,直接放入vector容器当中
for(int &v : vec){cout << v << " ";
}
cout << endl;map<int, string> mymap = jsbuf["path"];
for(auto &p : mymap){cout << p.first << " " << p.second << endl;
}
->  1 2 3 1 huang2 lv3 hong

http://www.ppmy.cn/devtools/7382.html

相关文章

逆向IDA中Dword,数据提取

我们可以看见数据是这样的&#xff0c;第一个是1cc 但是我们shifte就是 这个因为他的数据太大了&#xff0c;导致高位跑后面去了 这个时候&#xff0c;我们右键——convert——dword 这样就可以提取到争取的数据了 比如第一个数据 0x1cc a0xcc b0x1 print(hex((b<<8…

java设计模式之策略模式实操

一、背景 临床服务项目流向规则匹配&#xff0c;比如说医生开一个“CT”检查&#xff0c;该检查应该由哪个科室来执行&#xff0c;是通过流向规则配置来决定的&#xff0c;具体配置如下图&#xff1a; 通过相关的条件匹配&#xff0c;最终找到流向科室。 二、设计思路 有几个注…

【PyTorch】1-基础知识(张量、导数、CUDA)

PyTorch&#xff1a;1-基础知识 注&#xff1a;所有资料来源且归属于thorough-pytorch(https://datawhalechina.github.io/thorough-pytorch/)&#xff0c;下文仅为学习记录 1.1&#xff1a;张量 神经网络核心包&#xff1a;autograd&#xff08;自动微分&#xff09; 张量…

在线拍卖系统,基于SpringBoot+Vue+MySql开发的在线拍卖系统设计和实现

目录 一. 系统介绍 二. 功能模块 2.1. 管理员功能模块 2.2. 用户功能模块 2.3. 前台首页功能模块 2.4. 部分代码实现 一. 系统介绍 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系…

electron项目打包慢、打包报错

项目使用了electron框架&#xff0c;在第一次打包或者网络条件不好的环境下进行打包时熟速度慢的出奇&#xff0c;甚至经常出现打包失败的情况&#xff08;如上面图片的报错&#xff09;。 这是因为&#xff0c;在electron打包的过程中&#xff0c;需要去官方源https://github.…

05集合-CollectionListSet

Collection体系的特点、使用场景总结 如果希望元素可以重复&#xff0c;又有索引&#xff0c;索引查询要快? 用ArrayList集合, 基于数组的。(用的最多) 如果希望元素可以重复&#xff0c;又有索引&#xff0c;增删首尾操作快? 用LinkedList集合, 基于链表的。 如果希望增…

【Ansible】02

【Ansible】01 Ansible playbook 剧本 ansible-playbook 常用于复杂任务的管理管理经常要完成的任务playbook也是通过模块和它的参数 , 在特定主机上执行任务playbook是一个文件 , 该文件中需要通过yaml格式进行书写将经常需要执行的任务写入一个文件剧本/文件中可以包换多…

什么是RAG?

RAG是“Retrieval-Augmented Generation”的缩写&#xff0c;这是一种自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;用于增强生成式模型的性能&#xff0c;尤其是在问答、文本摘要、对话系统等任务中。RAG结合了检索&#xff08;Retrieval&#xff09;和生成&#…