JSON的序列化与反序列化以及VSCode执行Run Code 报错

JSON

JSON: JavaScript Object Notation JS对象简谱 , 是一种轻量级的数据交换格式。

JSON格式

复制代码
{ 
	"name":"金苹果", 
	"info":"种苹果" 
}

一个对象:由一个大括号表示.括号中通过键值对来描述对象的属性 (可以理解为, 大括号中, 包含的是一个个的键值对.)

格式:键与值之间使用冒号连接, 多个键值对之间使用逗号分隔,键值对的键 应使用引号引住,键值对的值, 可以是JS中的任意类型的数据。

JSON for Modern C++ 是一个由德国大牛nlohmann编写的在 C++ 下使用的 JSON 库,具有以下特点:

  • 直观的语法
  • 整个代码由一个头文件组成 json.hpp,没有子项目,没有依赖关系,没有复奈的构建系统,使用起未非常方便
  • 使用 C++ 11 标准编写
  • 使用 JSON 像使用 SIL 容器一样
  • SIL和JSON 容器之间可以相互转换
  • 严谨的测试:所有类都经过严格的单元测试,覆盖了100%的代码,包括所有特殊的行为。此外,还检查了 Valgrind 是否有内存泄漏。为了保持高质量,该项目遵循核心基础设施倡议(CII)的最佳实践。

序列化和反序列化

序列化 js.dump()

序列化是将对象 转换为字节流的一种方式,可以将对象写入文件,保存到数据库或者是进行网络传输发送到另外一个系统,这样即使在不同的环境或者系统中,只要可以读取这些字节流就可以构建出与初始对象状态完全相同的对象。

powershell 复制代码
#include "json.hpp"
using json = nlohmann::json;

#include <iostream>
#include <vector>
#include <map>
#include <string>
using namespace std;

void func1() {
    json js;
    js["msg_type"] = 2;
    js["from"] = "zhang san";
    js["to"] = "li si";
    js["msg"] = "hello!";
    string sendBuf = js.dump();  //json数据对象=》序列化 json字符串
    cout <<sendBuf.c_str()<<endl;
}

void func2() {
    json js;
    js["id"] = {1,2,3,4,5};
    js["name"] = "zhang san";
    js["msg"]["zhang san"] = "hi";
    js["msg"]["liu shuo"] = "ha";
    js["msg"] = {{"zhang san","hi"},{"liu shuo","ha"}};
    cout << js <<endl;
}

void func3() {
    json js;
    vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);

    js["list"] = vec;

    map<int,string> m;
    m.insert({1,"h"});
    m.insert({2,"w"});
    m.insert({3,"r"});
    js["path"] = m;

    cout << js <<endl;
}

int main() {
	func1();
	func2();
	func3();


    return 0;
}

反序列化 json::parse();

反序列化,将二进制流 转为对象的一种形式。是序列化的逆过程,即将序列化后的数据重新还原成原始的数据结构或对象。反序列化是从文件、网络数据或数据库中读取序列化的数据,并将其转换回原始形式,以便在程序中进行使用和操作。

powershell 复制代码
#include "json.hpp"
using json = nlohmann::json;

#include <iostream>
#include <vector>
#include <map>
#include <string>
using namespace std;

string func4() {
    json js;
    js["msg_type"] = 2;
    js["from"] = "zhang san";
    js["to"] = "li si";
    js["msg"] = "hello!";
    string sendBuf = js.dump();  //json数据对象=》序列化 json字符串
    //cout <<sendBuf.c_str()<<endl;
    return sendBuf;
}

string func5() {
    json js;
    vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);

    js["list"] = vec;

    map<int,string> m;
    m.insert({1,"h"});
    m.insert({2,"w"});
    m.insert({3,"r"});
    js["path"] = m;

    string sendBuf = js.dump(); 
    return sendBuf;
    //cout << js <<endl;
}

int main() {
    string recvBuf = func4();
    //数据的反序列化 json字符串=》 反序列化 数据对象(看作容器,方便访问)
    json jsbuf = json::parse(recvBuf);
    
    cout<<jsbuf["msg_type"]<<endl;
    cout<<jsbuf["from"]<<endl;
    cout<<jsbuf["to"]<<endl;
    cout<<jsbuf["msg"]<<endl;


    string recvBuf1 = func5();
    json jsbuf1 = json::parse(recvBuf1);
    vector<int> vec = jsbuf1["list"];
    for(int &v : vec)
    {
        cout<< v <<" ";
    }
    cout<<vec[1]<<endl;

    map<int, string> mymap = jsbuf1["path"];
    for(auto &p : mymap)
    {
        cout<<p.first<<" "<<p.second<<endl;
    }

    return 0;

}

注意VSCode可能在run code会报错:

解决办法:

打开code runner,点齿轮

选择扩展设置

找到 Code-runner:Executor Map 点击 在settings.json中编辑

在 "code-runner.executorMap"中 找到 "cpp" 的这一行,在 $fileNameWithoutExt 的后面添加 -std=c++11 保存后即可使用

相关推荐
Duck Bro2 小时前
MySQL:常用数据类型
java·数据库·c++·mysql·java-ee
z千鑫2 小时前
【C/C++】数据库链接入门教程:从零开始的详细指南!MySQL集成与操作
c语言·数据库·c++
脸ル粉嘟嘟2 小时前
linux(redhat8)如何安装mysql8.0之rpm&tar双版本(最新版)(内网)(离线)
linux·运维·adb
重生之我在VS写bug4 小时前
【C++知识总结2】C++里面的小配角cout和cin
数据结构·c++·算法
pzn25065 小时前
蓝桥杯练习题
c++·算法·蓝桥杯
Octopus20775 小时前
【Linux】vim的使用
linux·笔记·学习·vim
一个假的前端男5 小时前
VMware安装CentOS 9 及mysql的安装
linux·运维·centos
Zafir20245 小时前
Qt实现窗口内的控件自适应窗口大小
c++·qt·ui
捕鲸叉6 小时前
C++设计模式之组合模式中适用缓存机制提高遍历与查找速度
c++·设计模式·组合模式
北京迅为6 小时前
【北京迅为】iTOP-4412全能版使用手册-第七章 Android 4.4系统编译
linux·嵌入式硬件·4412开发板