C++ 手写 Web 服务器:JSON 序列化与 HTTP 协议实战
前置知识
在开始之前,建议先了解基本的序列化与反序列化概念。对于使用 TCP 协议进行通信的双方,由于 TCP 是面向字节流的,发送数据前通常需要定义一种结构化数据来描述传输内容。在 C++ 中,这通常表现为对象或结构体。
直接传递结构体内存中的字节会引发字节序和内存对齐问题。因此,我们需要借助序列化将结构化数据转换为连续的字节流,屏蔽平台差异。序列化分为文本序列化(如 JSON)与二进制序列化(如 Protobuf)。
| 特性 | 文本序列化 (JSON/XML) | 二进制序列化 (Protobuf/Thrift) |
|---|---|---|
| 可读性 | 极高(肉眼可读) | 低(十六进制乱码) |
| 传输体积 | 较大 | 极小 |
| 解析速度 | 较慢 | 极快 |
| 跨语言 | 完美 | 优秀 |
实际开发中,我们通常使用成熟的第三方库来完成这项工作。本文将重点介绍 JSON 格式及其在 C++ 中的应用。
JSON 基础
JSON(JavaScript Object Notation)是一种轻量级、基于文本的数据交换格式。它源于 JavaScript,但已被多种编程语言支持。JSON 本质上是一种符合规范的字符串。
基本类型
JSON 支持整型、浮点型、布尔型、字符串、对象和数组。
#include "json.hpp"
#include <iostream>
int main() {
// 初始化对象
nlohmann::json j = {{"name", "WZ"}, {"age", 20}, {"gender", "girl"}};
// 访问字段
std::string name = j["name"];
std::cout << name << std::endl;
return 0;
}




