Linux 网络编程实战:基于 C++ 实现 JSON 与 HTTP Web 服务器
引言
在 TCP 通信中,由于协议是面向字节流的,发送数据前通常需要定义结构化的数据容器。直接传输内存字节会引发字节序和内存对齐问题,因此我们需要序列化。序列化将结构化数据转换为连续字节流,屏蔽平台差异。
文本序列化(如 JSON)直观可读,便于调试;二进制序列化(如 Protobuf)体积小、解析快。本文重点探讨 JSON 在 C++ 中的应用及其在网络服务器中的实践。
JSON 基础与 nlohmann/json
JSON(JavaScript Object Notation)是一种轻量级、基于文本的数据交换格式。它支持对象、数组、字符串、数字、布尔值和 null。
使用第三方库
实际开发中推荐使用成熟的库,如 nlohmann/json。它通过一个 json 类映射数据结构,提供丰富的操作接口。
初始化与序列化
#include "json.hpp"
#include <iostream>
using json = nlohmann::json;
int main() {
// 列表初始化
json j = {{"name", "WZ"}, {"age", 20}};
// 访问与修改
std::string name = j["name"];
j["age"] = 21;
// 序列化输出
std::string s = j.dump(); // 紧凑格式
std::cout << s << std::endl;
// 格式化输出(缩进)
std::string formatted = j.dump(4);
return 0;
}
反序列化
将 JSON 字符串还原为对象。C++11 原始字符串字面量可简化构造过程。
std::string s = R"({"name":"WZ","age":18})";
json j = json::parse(s);
std::cout << j["name"] << std::endl;
内部原理简述
json 类内部维护类型标签和联合体值变量。基本类型直接存储,复杂类型(对象/数组)存储指针。构造函数根据输入决定类型, 重载实现了灵活的键值访问和自动扩容。


