nlohmann::json的dump()传入缩进参数(如2)即可实现带换行和空格的Pretty Print;需禁用Unicode转义(第四个参数设为false)、以文本模式正确写入UTF-8文件。

用 nlohmann::json 的 dump() 控制缩进实现 Pretty Print
直接调用 dump() 并传入缩进宽度,是最简单可靠的格式化方式。它默认不换行、无缩进;传一个整数参数(如 2)就自动启用带空格缩进的多行格式。
常见错误是误以为要手动拼接换行或调用其他函数——nlohmann::json 内置支持,无需额外处理。
-
json_obj.dump()→ 单行紧凑格式 -
json_obj.dump(2)→ 2 空格缩进,带换行和空格的可读格式 -
json_obj.dump(-1)→ 使用制表符缩进(注意:部分编辑器对混合空格/制表符渲染不一致) - 缩进值为
0时等效于不缩进(单行),但保留键名引号和基本转义
写入文件前必须确保 std::ofstream 以文本模式打开且编码正确
Windows 下若用默认构造打开文件,可能因换行符(\r\n)被二次转换导致 JSON 换行错乱;Linux/macOS 虽不敏感,但跨平台项目仍需统一处理。
关键点:不要用 std::ios::binary(会禁用换行转换,但 JSON 是文本,不该用二进制模式写);也不要依赖默认行为。
- 显式用
std::ofstream file("out.json");(文本模式,默认即可) - 写入前检查
file.is_open()和file.good() - 写入后调用
file.close(),或依赖 RAII 自动析构 - 避免在中文路径下用窄字符流(
std::ofstream),如需支持 Unicode 路径,应改用std::wofstream+std::locale或 UTF-8 编码路径(C++20std::filesystem::u8path)
输出含中文的 JSON 时,nlohmann::json 默认转义 Unicode,需显式关闭
默认情况下,nlohmann::json 会把非 ASCII 字符(如中文)转成 \uXXXX 形式,导致文件内容不可读。这不是 bug,而是 JSON 规范兼容性设计,但日常调试或配置文件中通常需要原生 UTF-8 显示。
- 调用
dump(2, ' ', '\n', nlohmann::json::error_handler_t::replace)不影响中文显示 - 真正起作用的是设置序列化选项:
json_obj.dump(2, ' ', '\n', false)—— 第四个参数为false表示不转义非 ASCII 字符 - 完整推荐写法:
file - 注意:文件保存必须为 UTF-8 编码(现代编辑器默认如此),否则中文仍会乱码
避免 std::endl 导致多余换行和性能损耗
有人习惯在写入 JSON 后加 file ,这会在文件末尾多出一个空行,破坏 JSON 有效性(严格来说,JSON 文本不应有尾随空白,部分解析器会报 parse error at 1:xxx)。
- 用
'\n'替代std::endl(std::endl= 写入\n+ 刷新缓冲区,没必要) -
dump()已包含结尾换行(当缩进 > 0 时),无需额外添加 - 如果非要确保文件以换行结尾,检查
dump()输出末尾是否已有\n,再决定是否追加 —— 但更稳妥的做法是不做任何追加
最易被忽略的是中文转义控制和文件末尾换行。这两个点不报错,但会导致生成的 JSON 在人眼层面“看起来不对”或被某些严格解析器拒绝。只要记牢 dump(2, ' ', '\n', false) 这个调用组合,95% 的 Pretty Print 场景就稳了。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











