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 保存后即可使用

相关推荐
wowocpp1 小时前
查看 linux ubuntu 分区 和 挂载 情况 lsblk
linux·运维·ubuntu
wowocpp1 小时前
查看 磁盘文件系统格式 linux ubuntu blkid ext4
linux·数据库·ubuntu
龙鸣丿2 小时前
Linux基础学习笔记
linux·笔记·学习
耶啵奶膘4 小时前
uniapp-是否删除
linux·前端·uni-app
奋斗的小花生4 小时前
c++ 多态性
开发语言·c++
闲晨4 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
2401_850410835 小时前
文件系统和日志管理
linux·运维·服务器
XMYX-05 小时前
使用 SSH 蜜罐提升安全性和记录攻击活动
linux·ssh
UestcXiye6 小时前
《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列
c++·计算机网络·ip·tcp
霁月风7 小时前
设计模式——适配器模式
c++·适配器模式