JSON介绍
Json是一种轻量级的数据交换格式(也叫数据序列化方式)。Json采用完全独立于编程语言的文本格式来存储和表示数据。简介和清晰的层次结构使得Json成为理想的交换格式。易于阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
跟XML相比,Json的优势在于格式简介短小,特别是在处理大量复杂数据的时候
Json是一个优秀的第三方库。其中JSON OF MODERN C++是由德国大牛nlohmann编写的,所以命名空间的名字也是
nlohmann
。
Json的特点
- 直观的语法
- 整个代码由一个头文件组成,没有子项目,使用方便
- 使用C++ 11标准编写
- 使用json像使用STL容器一样
- STL和json可以互相转换
- 所有类都经过严格的单元测试,较为健壮
Json源码:点此跳转
Json的结构
- “名称/值”对的集合:
js["键"] = {“值”};
- 值的有序列表:
js["键”] = {值,值,值};
Json形式
-
对象是一个无序的“‘名称/值’ 对”集合。
-
数组是值的有序集合。值可以使双引号括起来的字符串、数值、true、false、null、对象和数组。当然,也可以套娃
使用Json
包含json头文件
使用就简单的包含以下头文件,就可以使用 json 提供给我们的接口了。
#include"json.hpp"
using json = nlohmann::json;
json数据序列化
序列化就是把我们想要打包的数据或者对象直接处理成Json字符串。
-
普通数据序列化
void func1() { json js; js["msg_type"] = 2; js["form"] = "zhang san"; js["to"] = "li si"; js["msg"] = "hello,world!"; cout << js << endl; } 输出如下: { "msg":"hello,world!","form":"zhang san","msg_type":2,"to":"li si"} 可以看到,是无序的
-
容器序列化
void func3() { json js; //序列化一个容器 vector<int> vec; vec.push_back(1); vec.push_back(2); js["list"] = vec; map<int, string> m; m.insert({ 1,"华山" }); m.insert({ 2,"泰山" }); js["path"] = m; cout << js << endl; } 输出如下: { "list":[1,2],"path":[[1,"华山"],[2,"泰山"]]}
-
转化成字符串
//转成字符串,网络用 string sendbuf = js.dump(); cout << sendbuf.c_str() << endl;
Json的数据反序列化
void reserve(string& recvbuf)
{
//把字符串转换成json对象
json jsbuf = json::parse(recvbuf);
cout << jsbuf["msg"] << endl;
cout << jsbuf["id"] << endl;
auto arr = jsbuf["id"];
auto msgjs = jsbuf["msg"];
cout << msgjs["zhang san"] << endl;
vector<int> vec = jsbuf["list"];
}
参考文献
[1] 施磊.集群聊天服务器.图论科技.2020.7.
[2] JSON C语言开发指南.