Linux网络:序列化与反序列化
引入:面向字节流
TCP是面向字节流的,如果按照字节流来读取信息,可能会出问题
比如客户传入“1+100”,服务器读入“1+1”,后面的00被当作下一条信息,这就出问题了
我们可以将多个信息合并为一个字符串
在发送信息时,将信息按照规则转化为一个字符串再传过去。服务器端收到后,再解析字符串获得完整信息
这就是序列化与反序列化
JSON简介
JSON 是一种轻量级的数据交换格式,具有良好的可读性和结构性。它支持的数据类型包括字符串、数值、布尔值、数组、对象和
null
。
C++ 中常用的 JSON 库包括:
nlohmann/json
RapidJSON
JsonCpp
本文会涉及nlohmann/json和JsonCpp
Json类型
Json支持三种基本结构:标量、数组和对象
标量类型
标量是最基本的数据类型,JSON 中支持以下几种标量类型:
类型 | 示例 | 说明 |
---|---|---|
字符串 | "hello" | 必须用双引号括起来的文本 |
数字 | 123 , 3.14 | 可为整数或小数(不支持 NaN 等) |
布尔值 | true , false | 小写,表示逻辑值 |
空值 | null | 表示空或无值 |
数组
数组是一组有序的数据集合,用 []
表示,元素之间用逗号分隔。
[18, 180, 170, "lihua", true, null]
- 可以包含不同类型的数据(数字、字符串、对象等)
- 数组下标从
0
开始
对象
对象是一组键值对集合,用 {}
表示,键必须是字符串。
{"name": "Alice","age": 25,"isStudent": false
}
- 每个“键”都是字符串
像最开始举的例子:1+100,就可以表示为
{"left": 1,"operator": "+","right": 100
}
- “值”可以是标量、数组或另一个对象 (即支持嵌套)
像下面这样
{"user": {"name": "LiHua","age": 18,"languages": ["C++", "Python", "Go"],"active": true,"profile": null}
}
- user 是一个对象
- “name” 是字符串,属于标量
- “age” 是数字,属于标量
- “languages” 是数组,数组中是字符串
- “active” 是布尔值
- “profile” 是空值 null
给出一个创建 JSON 的例子。
#include <iostream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;int main() {json j;j["name"] = "Tom";j["age"] = 25;j["scores"] = {90, 85, 92};std::cout << j.dump(4) << std::endl; // 4格缩进return 0;
}
输出结果:
{"age": 25,"name": "Tom","scores": [90,85,92]
}
<nlohmann/json.hpp>
nlohmann/json
是一个头文件式的现代 C++ JSON 库,使用时只需包含一个头文件即可:
#include <nlohmann/json.hpp>
using json = nlohmann::json;
序列化与反序列化
序列化(Writer)
序列化即将对象转成字符串形式,用于存储或传输。使用 .dump()
方法可完成序列化。
json j;
j["title"] = "C++ JSON";
j["version"] = 1.0;
j["tags"] = {"serialization", "json", "cpp"};std::string output = j.dump(); // 无缩进
std::string formatted = j.dump(4); // 缩进4格格式化std::cout << output << std::endl;
输出:
{"tags":["serialization","json","cpp"],"title":"C++ JSON","version":1.0}
3.2.2 反序列化(Reader)
反序列化是将 JSON 字符串解析为 json
对象。可以使用 json::parse()
方法。
std::string input = R"({"name": "ming","age": 30,"active": true
})";json j = json::parse(input);std::string name = j["name"];
int age = j["age"];
bool active = j["active"];std::cout << "Name: " << name << ", Age: " << age << ", Active: " << std::boolalpha << active << std::endl;
输出:
Name: ming, Age: 30, Active: true
总结
介绍了序列化和反序列化的使用