最省心的方式是用nlohmann/json库直接构造json对象再调用dump()转字符串:包含头文件后,通过j["key"]=value赋值,支持嵌套与stl容器,dump()默认紧凑输出,加参数可缩进美化,避免手动拼接引发的转义、类型、编码等错误。

用 nlohmann/json 直接构造对象再转字符串
最省心的方式是用 nlohmann/json 库,它把 JSON 当成一等公民来操作,不用拼字符串、也不用写嵌套结构体。只要包含头文件,就能直接用 json 类型构造和序列化:
#include <nlohmann>
using json = nlohmann::json;
json j;
j["name"] = "Alice";
j["age"] = 30;
j["hobbies"] = {"reading", "coding"};
std::string s = j.dump(); // → {"name":"Alice","age":30,"hobbies":["reading","coding"]}
</nlohmann>
注意:dump() 默认不缩进,加参数可美化输出,比如 j.dump(2);如果字段名含特殊字符(如空格、点号),必须用 operator[] 的字符串重载形式,不能用点语法。
手动拼接字符串会出什么问题
有人图快直接用 std::ostringstream 或 std::string 拼接,比如 "{\"name\":\"" + name + "\"}",这看似简单,实则埋雷:
- 中文或控制字符没做 Unicode 转义(
uXXXX),JSON 解析器可能直接报错parse error: invalid string: control character - 字段值里含双引号或反斜杠时,不转义会导致语法错误,例如
name = "O'Reilly"会生成"name":"O'Reilly"(缺转义) - 数字类型混淆:把
int当字符串拼进去,结果变成"age":"30"(字符串而非数字),下游解析可能失败
需要兼容 C++11 且不能用第三方库怎么办
标准库没有 JSON 支持,但可以用轻量级方案:手写一个最小安全转义函数,配合 std::map 和 std::vector 模拟结构,再递归生成字符串。关键点在于:
- 字符串值必须调用转义函数:处理
"、、、、、、和 Unicode 非 ASCII 字符 - 区分数字、布尔、null:用
std::is_arithmetic_v<t></t>判断是否为数字,bool单独分支输出true/false,nullptr输出null - 避免重复分配:用
std::string::reserve()预估长度,减少 reallocation
这不是推荐做法,仅在极受限环境(如嵌入式、白名单编译器)下临时兜底。
为什么不要自己实现完整 JSON 库
JSON 看似简单,但边界情况极多:浮点数精度(0.1 + 0.2 != 0.3 在 JSON 中要输出为 0.30000000000000004 还是四舍五入?)、NaN/Infinity 是否允许、键名重复如何处理、超大数组的栈溢出风险……nlohmann/json 已覆盖所有 RFC 8259 场景,且通过了 json-test-suite 全部 300+ 测试用例。自己写几百行代码,很难比它更稳。
真正容易被忽略的是:跨平台构建时,nlohmann/json 是 header-only,但某些旧版 GCC(如 4.8)对模板深度支持不足,编译大 JSON 对象可能报 template instantiation depth exceeds maximum —— 这时候不是删功能,而是升级编译器或改用 json::parse() 分段构造。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











