Linux 网络编程实战:基于 C++ 实现 JSON+HTTP Web 计算器服务器
引入
在之前的学习中,我们了解了序列化与反序列化的概念。对于使用 TCP 协议进行通信的双方,由于 TCP 是面向字节流的,在发送数据之前,通常需要定义一种结构化的数据来描述传输内容。在 C++ 中,这种结构化数据通常表现为对象或结构体。然而,我们不能直接将结构体内存中对应的字节原样发送到另一端,因为直接传递内存字节会引发字节序和结构体内存对齐的问题。
因此,我们需要借助序列化。序列化是指将结构化的数据按照预定的规则转换为连续的字节流。其主要目的是屏蔽平台差异,使得位于不同平台的进程能够以统一的方式解析该字节流。文本序列化直观、可读性高,而二进制序列化传输体积更小。在实际开发中,我们通常不需要从头实现序列化,可以使用成熟的第三方库来完成这项工作。本文将介绍的第一个主题——JSON,就是一种广泛应用的文本序列化格式。
JSON 详解
JSON(JavaScript Object Notation)是一种轻量级、基于文本、人类可读的数据交换格式。它源于 JavaScript,但能跨语言解析。JSON 支持整型、浮点型、布尔型、字符串、对象及数组等基本数据类型。
nlohmann/json 库的使用
在 C++ 中,常用的 JSON 库包括 json.hpp(即 nlohmann/json)。它是一个单头文件库,无需编译,只需将其包含到项目中即可。
初始化与操作
json 类的定义位于 nlohmann 命名空间内。创建 json 对象主要有两种方式:
- 列表初始化:利用 C++11 特性,通过构造函数传递键值对。
#include "json.hpp"
#include <iostream>
using json = nlohmann::json;
int main() {
json j = {{"name", "WZ"}, {"age", 20}, {"gender", "girl"}};
std::cout << j.dump() << std::endl;
return 0;
}
- 赋值运算符:更推荐的方式,符合 C++ 标准库容器习惯。
json j;
j["name"] = "wz";
j["age"] = 20;
j["gender"] = "girl";
序列化与反序列化
json 类提供了 成员函数用于序列化,返回 。若不传参数,生成紧凑格式;若传入整数,则按指定空格数格式化输出。


