Json三方库介绍

目录

  • 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.hqwc.cn/news/636649.html

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

相关文章

STM32H750外设ADC之双重 ADC 模式

目录 概述 1 双重 ADC 模式介绍 1.1 双重 ADC模式 1.2 双重 ADC 模式的类型 2 双重 ADC 模式寄存器的配置 3 模式功能实现 3.1 注入同步模式 3.2 支持独立注入的常规同步模式 3.2.1 中断的方式 3.2.2 DMA 读取常规数据 3.3 支持独立注入的交替模式 3.3.1 中断触发…

企业车辆违章查询工具,批量查询企业名下车辆违章情况,专为网约车/出租车管理公司而生

功能介绍 功能分为&#xff1a;违章管理、车辆管理、任务管理 违章管理如图&#xff1a; 搜索条件为车牌号 筛选条件为&#xff1a;时间区间、企业选择、是否处理违章、是否缴纳罚款、所属车管员 车牌管理如图&#xff1a; 可以新增车牌 查询条件为&#xff1a;车牌信息、车…

24五一杯资料汇总!!!!

以下内容为23年五一杯内容&#xff0c;24年也将会按时更新资料&#xff01;&#xff01;&#xff01; 问题1&#xff1a;给定建筑物数据&#xff0c;假设该建筑物内温度需要一直保持在18-26度&#xff0c;在温度不适宜的时候要通过电来调节温度&#xff0c;消耗一度电相当于0.…

最新网课交单平台源码 网课下单源码 网课平台搭建源码 网课对接平台搭建

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 网课交单平台源码最新修复全开源版本 去除论文编辑 去除强国接码 修复上级迁移 修复聚合登录 修复支付不回调 优化支付接口兼容码/易支付 优化MySQL表&#xff0c;提高网页加载…

14. Spring AOP(二)实现原理

源码位置&#xff1a;spring_aop 上一篇文章中我们主要学习了AOP的思想和Spring AOP使用&#xff0c;本文讲的是Spring是如何实现AOP的&#xff0c;Spring AOP是基于动态代理来实现AOP的&#xff0c;在将动态代理之前先来了解一下什么是代理模式。 1. 代理模式 在现实中就有许…

如何查询下载自然资源相关的法律法规

自然资源部门户网站- 政策法规库 (https://f.mnr.gov.cn/) 以查询下载“节约用水条例”为例&#xff1a;输入标题&#xff0c;点击检索&#xff0c;出现对应的检索结果&#xff1a; 打开详细&#xff0c;可以看到节约用水条例的详细内容&#xff1a; 点击文后的打印或者下载&a…

构建信息安全感知程序(一)

原文&#xff1a;annas-archive.org/md5/cb5e79ad1f7a31eaf76b82b01d6af659 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 公司每年投入数百万美元购买最新的安全产品&#xff0c;从防火墙到门禁系统&#xff0c;但他们未能投资于保护环境中最宝贵的资源——更…

【C++类和对象】const成员函数及流插入提取

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

【论文精读】Attention is all you need

摘要 主要的序列转换模型是基于复杂的循环或卷积神经网络&#xff0c;其中包括一个编码器和一个解码器。性能最好的模型还通过一种注意力机制将编码器和解码器连接起来。我们提出了一种新的简单的网络架构&#xff0c;Transformer&#xff0c;完全基于注意机制&#xff0c;完全…

在ubuntu20.04下迁移anaconda的目录,试验不行后,换成软连接

一、原因 随着不断的搭建不同的算法环境&#xff0c;原本在固态硬盘上安装的anaconda上占用空间越来越多。导致可用的固态硬盘空间越来越少&#xff0c;又因安装的环境太多&#xff0c;重新搭建比较费时费力。有没有直接将当前已经搭建好环境的anaconda 迁移到另外的目录呢&…

【C# 数据结构-队列】

在C#中&#xff0c;队列&#xff08;Queue&#xff09;是一种先进先出&#xff08;First In First Out&#xff0c;FIFO&#xff09;的数据结构&#xff0c;允许添加&#xff08;Enqueue&#xff09;和移除&#xff08;Dequeue&#xff09;元素。队列类在.NET Framework的Syste…

C++参考手册使用说明

C参考手册使用说明 文章目录 C参考手册使用说明1 为什么要使用C参考手册2 网站3 C参考手册离线格式4 C参考手册使用说明1.1 离线C参考手册下载1.2 html离线C参考手册1.3 chm离线C参考手册1.4 linux安装包C参考手册&#xff08;只有英文版本&#xff09;1.5 qch离线C参考手册 更…