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()

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

#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();

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

#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 保存后即可使用
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值