C++ 网络编程实战:JSON+HTTP,手搓一个 Web 计算器
在之前的学习中,我们了解了序列化与反序列化的概念。对于基于 TCP 通信的双方,由于 TCP 是面向字节流的,发送数据前通常需要定义一种结构化数据来描述内容。在 C++ 中,这通常表现为对象或结构体。但直接发送内存字节会引发字节序和内存对齐问题,因此我们需要借助序列化将结构化数据转换为连续的字节流。
JSON 序列化与 nlohmann/json
JSON(JavaScript Object Notation)是一种轻量级、基于文本的数据交换格式。它源于 JavaScript,但已广泛应用于多种语言。JSON 本质上是一种符合规范的字符串,支持整型、浮点型、布尔型、字符串、对象和数组等类型。
在实际开发中,我们通常使用成熟的第三方库来处理 JSON。C++ 中常用的 json.hpp(即 nlohmann/json)提供了便捷的接口。该库维护了一个 json 类,可实例化为 JSON 对象,通过重载运算符提供类似标准库容器的操作体验。
基本用法
创建 JSON 对象主要有两种方式:列表初始化或直接赋值。
#include "json.hpp"
#include <iostream>
int main() {
// 方式一:列表初始化
nlohmann::json j1 = {{"name", "WZ"}, {"age", 20}};
// 方式二:直接赋值(推荐)
nlohmann::json j2;
j2["name"] = "WZ";
j2["age"] = 20;
// 序列化输出
std::cout << j1.dump() << std::endl; // 紧凑格式
std::cout << j1.dump(4) << std::endl; // 格式化缩进
return 0;
}
原理简析
json.hpp 内部维护一个联合体 internal_value 来存储不同类型的数据。基本类型直接存储值,复杂类型(如字符串、数组)存储指针以减少内存占用。构造函数根据输入参数决定类型标签,并通过 operator[] 重载实现灵活的读写访问。当访问不存在的键时,会自动创建对应的 json 对象,这种设计极大地简化了代码编写。
HTTP 协议详解
HTTP 是应用层通信协议,定义了请求与响应报文的格式。理解其结构是实现 Web 服务器的基础。


