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字符串

  1. 普通数据序列化

    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"}
    可以看到,是无序的
    
  2. 容器序列化

    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,"泰山"]]}
    
  3. 转化成字符串

    //转成字符串,网络用
    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语言开发指南.