Json三方库介绍

2024-04-18 00:52
文章标签 介绍 json 三方

本文主要是介绍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

这篇关于Json三方库介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/913345

相关文章

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

20.Spring5注解介绍

1.配置组件 Configure Components 注解名称说明@Configuration把一个类作为一个loC容 器 ,它的某个方法头上如果注册7@Bean , 就会作为这个Spring容器中的Bean@ComponentScan在配置类上添加@ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>@Sc

如何在Java中处理JSON数据?

如何在Java中处理JSON数据? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在Java中如何处理JSON数据。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在现代应用程序中被广泛使用。Java通过多种库和API提供了处理JSON的能力,我们将深入了解其用法和最佳

C++标准模板库STL介绍

STL的六大组成部分 STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,提供了丰富的通用数据结构和算法,使得 C++ 编程变得更加高效和方便。STL 包括了 6 大类组件,分别是算法(Algorithm)、容器(Container)、空间分配器(Allocator)、迭代器(Iterator)、函数对象(Functor)、适配器(Adapter)

直接得到Json串,转换为字典

0.新创建一个json文件,把json串拷贝到里面 1.先通过MainBundle找到资源对应的路径 2.将文件转换为NSData 3.通过NSJSonSerization得到字典 NSString*fileName=[[NSBundle mainBundle] pathForResource:@"myJson" ofType:@"json"];           NS

一二三应用开发平台应用开发示例(4)——视图类型介绍以及新增、修改、查看视图配置

调整上级属性类型 前面为了快速展示平台的低代码配置功能,将实体文件夹的数据模型上级属性的数据类型暂时配置为文本类型,现在我们调整下,将其数据类型调整为实体,如下图所示: 数据类型需要选择实体,并在实体选择框中选择自身“文件夹” 这时候,再点击生成代码,平台会报错,提示“实体【文件夹】未设置主参照视图”。这是因为文件夹选择的功能页面,同样是基于配置产生的,因为视图我们还没有配置,所以会报错。

php json_encode 大括号中括号

当array是一个从0开始的连续数组时,json_encode出来的结果是一个由[]括起来的字符串。 而当array是不从0开始或者不连续的数组时,json_encode出来的结果是一个由{}括起来的key-value模式的字符串。 当字符串为[1,1,1] 这种模式时,json_decode默认解析出来的结果是一个数组。 当字符串为{"1":1,"2":1} 这种模式时,json_

49-1 内网渗透 - Bypass UAC介绍

一、Bypass UAC         用户账户控制(UAC)是Windows操作系统的一种安全机制,旨在防止未经授权的应用程序自动安装并防止非授权修改系统设置。它确保应用程序和任务通常在非管理员账户的安全上下文中运行,除非明确需要管理员权限,用户才会被提示确认。         对于非RID 500的管理员用户(除了内置的Administrator账户),当他们登录时,系统会为其分配两个访

okhttp3的详细介绍

这篇文章说下OkHttp的基本用法,是最新的3哦,如果你曾经在网上搜索OkHttp怎么使用发现有些类没有了可能是因为人家说的是2。首先说下OkHttp3是Java和Android都能用,Android还有一个著名网络库叫Volley,那个只有Android能用。导入自己到入jar包,别漏了okio:okhttp-3.3.0.jarokio-1.8.0.jarmaven方式:<dependen

Retrofit详细介绍

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51910837 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的收货! 一、Retrofit 是什么? Retrofit is a type-safe HTTP client for Android and java. Retrofit 是与 Web 服务器提