素材巴巴 > 程序开发 >

JSON数据序列化

程序开发 2023-09-03 23:12:38

json介绍

Json是一种轻量级的数据交换格式(也叫数据序列化方式)。Json采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 Json 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

json的优点

  1. 语法直观;
  2. 所有代码由一个json.hpp头文件组成,不存在子项目、依赖关系、复杂的构建系统,使用起来方便;
  3. 使用C++11标准编写;
  4. 类似STL容器,可以直接调用,可以和STL容器之间相互转换;

常用的数据传输序列化

  1. XML: 数据具有层次结构,可以被大多数编程语言使用,使用XML获取XML文档,接数据解析出来复制给变量。
  2. JSON:json更加简短,读写速度快,占用带宽小,可以使用数组,解析起来比XML更容易,与XML相比,最大的不同是XML 需要使用 XML 解析器来解析,JSON 可以使用标准的 JavaScript 函数来解析。
  3. ProtoBuf:通常使用在公司级别的项目中,大量使用ProtoBuf作为数据序列化的方式,占用带宽比以上两种方式小,但是使用起来比JSON复杂,所以通常在项目中选择使用json格式来打包传输数据。

调用JSON头文件

#include "json.hpp"
 using json = nlohmann::json;
 

在这里插入图片描述

JSON数据序列化

把想要打包的数据或对象直接处理成JSON字符串。可以分为两种:

  1. 普通数据序列化
json js;
 // 添加数组
 js["id"] = {1,2,3,4,5};
 // 添加key-value
 js["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;
 
  1. 容器序列化
json js;
 // 直接序列化一个vector容器
 vector vec;
 vec.push_back(1);
 vec.push_back(2);
 vec.push_back(3);
 js["list"] = vec;
 // 直接序列化一个map容器
 map m;
 m.insert({1, "北京"});
 m.insert({2, "上海"});
 m.insert({3, "深圳"});
 js["path"] = m;
 cout<

JSON数据反序列化

从网络接收到字符串为JSON格式,可以反序列化获得数据或对象和容器。

string jsonstr = js.dump();
 json js2 = json::parse(jsonstr);
 string name = js2["name"];
 cout << "name:" << name << endl;
 // 直接反序列化vector容器
 vector v = js2["list"];
 for(int val : v)
 {
 cout << val << " ";
 }
 cout << endl;
 // 直接反序列化map容器
 map m2 = js2["path"];
 for(auto p : m2)
 {
 cout << p.first << " " << p.second << endl;
 }
 cout << endl;
 

标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。