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