C++ 实现 JSON 与 HTTP 协议的网络服务器
在之前的学习中,我们了解了序列化与反序列化的概念。对于基于 TCP 通信的双方,由于 TCP 是面向字节流的,发送数据前通常需要定义一种结构化数据来描述传输内容。在 C++ 中,这通常表现为对象或结构体。然而,直接发送内存字节会引发字节序和内存对齐问题,不同平台和编译器可能导致解析错误。
因此,我们需要借助序列化。序列化是将结构化数据按预定规则转换为连续字节流的过程,目的是屏蔽平台差异。文本序列化(如 JSON)直观可读但体积较大;二进制序列化(如 Protobuf)体积小但不可读。本文将重点介绍广泛使用的文本序列化格式 JSON,并在此基础上实现一个基于 C++ 的 Web 计算器服务器。
JSON 基础与使用
JSON(JavaScript Object Notation)是一种轻量级、基于文本的数据交换格式。它源于 JavaScript,但已被多种语言支持,具备跨平台和跨语言能力。JSON 本质上是一种符合规范的字符串,支持整型、浮点型、布尔型、字符串、对象和数组等类型。
nlohmann/json 库的使用
在实际开发中,推荐使用成熟的第三方库。C++ 中常用的是 json.hpp(即 nlohmann/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;
return 0;
}
dump() 成员函数用于序列化,返回 std::string。默认生成紧凑格式,也可传入整数参数指定缩进空格数,便于调试。
反序列化
将 JSON 字符串还原为 json 对象可使用静态成员函数 parse()。C++11 引入了原始字符串字面量 R"()" 语法,可避免转义字符的繁琐处理。
#include "json.hpp"
#
{
std::string s = ;
nlohmann::json j = nlohmann::json::(s);
std::cout << j[] << std::endl;
;
}


