C++ 实现 JSON 与 HTTP 协议:从零构建 Web 计算器服务器
在之前的网络编程实践中,我们处理过 TCP 字节流传输。对于面向字节流的 TCP 协议,通信双方通常需要定义一种结构化的数据来描述传输内容。直接传递内存中的结构体字节会引发字节序和内存对齐的问题,不同平台和编译器的规则可能不一致。因此,我们需要借助序列化技术,将结构化数据转换为连续的字节流。
文本序列化(如 JSON)直观、可读性高,便于调试;而二进制序列化(如 Protobuf)体积更小、解析更快。在实际开发中,我们通常使用成熟的第三方库来完成这项工作。本文将介绍如何使用 C++ 结合 nlohmann/json 库处理 JSON 数据,并基于 HTTP 协议实现一个简易的 Web 服务器。
JSON 数据处理
JSON(JavaScript Object Notation)是一种轻量级、基于文本的数据交换格式。它源于 JavaScript,但已广泛应用于多种编程语言。JSON 本质上是一种符合特定规范的字符串,支持整型、浮点型、布尔型、字符串、对象和数组等类型。
在 C++ 中,常用的 JSON 库是 nlohmann/json(即 json.hpp)。它是一个头文件库,无需编译安装,只需将其包含在项目目录中即可。该库提供了一个 json 类对象,用于存储和操作 JSON 数据。
初始化与操作
创建 json 对象主要有两种方式。第一种是通过构造函数进行列表初始化,利用 C++11 特性传入键值对或元素列表:
#include <nlohmann/json.hpp>
using json = nlohmann::json;
// 对象初始化
json j = {{"name", "WZ"}, {"age", 20}, {"gender", "girl"}};
// 数组初始化
json arr = {1, 2, 3, 4, 5};
更推荐的方式是使用赋值运算符,这更符合 C++ 标准库容器的使用习惯:
json j;
j["name"] = "wz";
j["age"] = 20;
j["gender"] = "girl";
序列化与反序列化
json 类提供了 dump() 成员函数用于序列化,返回类型为 std::string。若不传参数,默认生成紧凑格式;若传入整数参数,则按指定缩进格式化输出。
std::string s = j.dump(); // 紧凑格式
std::string s_pretty = j.dump(2);


