c++生成json文件方法 c++如何实现写入json文件

畫卷琴夢

畫卷琴夢

2026-03-23

576人浏览

原创

最省事直接的方法是使用 nlohmann/json 库:头文件即用,支持自然初始化如 json j = {{"name", "alice"}, {"age", 30}},序列化只需 std::ofstream("data.json")

c++生成json文件方法 c++如何实现写入json文件

nlohmann/json 库写 JSON 文件最省事

直接结论:C++ 标准库不带 JSON 支持,必须用第三方库;nlohmann/json 是目前最主流、语法最接近现代 C++ 的选择,头文件即用,无需编译依赖。

它把 JSON 当成一等公民来设计,比如支持 json j = {{"name", "Alice"}, {"age", 30}}; 这种自然初始化,序列化也只需一句 std::ofstream("data.json") 。

常见错误是手动拼接字符串(如 "{\"name\":\""+name+"\"}"),这极易出错——引号转义漏掉、中文乱码、嵌套结构崩塌,而且完全没法校验合法性。

  • 确保项目能访问头文件:下载 json.hpp 放入 include 路径,或用 vcpkg/conan 安装
  • 别用旧版(如 3.x):v3.11.2+ 才默认启用 UTF-8 字符串安全处理,否则中文可能变 \uXXXX
  • 写文件前检查路径可写:Windows 下当前目录可能被权限限制,建议显式指定绝对路径或先 std::ofstream f("test.json"); if (!f) { /* 失败 */ }

std::ofstream 直接输出 JSON 时的编码和换行问题

JSON 是纯文本,但输出时容易踩两个坑:一是 Windows 换行符 \r\n 会被当成非法字符(虽然多数解析器容忍,但严格模式下报错);二是未声明 UTF-8 BOM 或编码设置,导致中文显示为乱码或 \uXXXX 序列。

nlohmann/json 默认以 UTF-8 输出,不加 BOM,这是正确做法(JSON RFC 明确要求 UTF-8 且不强制 BOM)。你只需确保终端/编辑器用 UTF-8 解码即可。

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载
  • 避免用 std::endl:它会插入 \n 并刷新缓冲区,影响性能;直接用 "\n" 即可
  • 如果需要紧凑格式(无空格缩进),调用 j.dump(-1);默认 j.dump() 是带缩进的易读格式
  • 不要对 std::ofstream 手动 setlocale:C++ 流的 locale 不影响 UTF-8 字节流,设了反而可能干扰

写入失败却没报错?检查 std::ofstream 状态位

常见现象:std::ofstream f("out.json"); f 看似执行成功,但文件为空或根本没生成。根本原因不是 JSON 库的问题,而是文件流打开失败后,<code>operator 仍会静默执行(只是不写入)。

C++ 流默认关闭异常模式,错误全靠状态位(failbit/badbit)指示,不主动检查就等于“假装成功”。

  • 务必在写完后检查:if (f.fail()) { /* 处理失败 */ },或者更早检查打开是否成功:if (!f.is_open())
  • 路径含中文或特殊字符时,Windows 下需用 std::filesystem::path 构造并转宽字符,或改用 UTF-8 路径(需编译器支持,如 MSVC 19.32+ 加 /utf-8
  • Linux/macOS 下注意父目录是否存在:std::ofstream 不会自动创建多级目录,mkdir -p 得自己调用 std::filesystem::create_directories

需要高性能或嵌入式环境?别硬上 nlohmann/json

它的优势是开发效率,劣势是运行时开销:每个 key 查找走哈希表,对象构建涉及多次堆分配,小资源设备或高频写入场景(如每毫秒写一次传感器数据)会明显卡顿。

这时候应考虑轻量替代方案:

  • rapidjsonWriter 模式:纯栈分配 + SAX 风格写入,速度更快,但 API 更底层,得手动控制 StartObject()/String()/EndObject() 流程
  • 极简场景下,手写模板函数生成固定结构 JSON(如 fmt::format(R"({{"ts":{}, "val":{}}})", ts, val)),前提是字段数少、无动态嵌套、且能保证值本身不含双引号或控制字符
  • 千万别用 printf 类接口拼接:C 风格格式化无法自动转义字符串中的 "\n,一写就崩

真正难的从来不是“怎么写出 JSON”,而是“怎么让 JSON 写得稳、读得准、改得不破”。路径权限、编码一致性、错误反馈链,这些地方漏一个,调试时间翻倍。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

1563

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

1426

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

589

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

1338

7

Qt Creator按钮响应设置方法
Qt Creator按钮响应设置方法

信号槽是 Qt 开发的核心机制。本专题整理 Qt Creator 中按钮点击、菜单触发、输入变化、窗口事件、自定义信号、自动连接槽函数和手动 connect 写法,帮助用户理解界面控件如何和 C++ 代码联动。

2026.08.05

0

10

Qt Creator新建项目使用教程
Qt Creator新建项目使用教程

本专题整理 Qt Creator 新建项目、打开已有工程、项目模板选择、目录结构、源文件管理、构建目录、运行配置和项目迁移方法,重点解决新手不知道选 qmake 还是 CMake、项目打不开、文件不参与编译等常见问题。

2026.08.05

0

10

maven常用插件使用大全
maven常用插件使用大全

PHP中文网精心整理Maven主流插件用法合集,涵盖编译、测试、打包等常用插件使用大全。从基础配置到进阶实战,详细解析各插件功能与适用场景,助你轻松掌握Maven自动化构建,解决Java项目开发痛点,是开发者必备的实用指南。

2026.08.05

0

31

PyCharm快速入门指南
PyCharm快速入门指南

本专题汇总了PyCharm快速入门的全套指南与教程,涵盖从官网下载安装、创建第一个Python项目、配置虚拟环境,到代码编辑、运行调试等基础操作,并整理了版本控制(Git)集成、常用高效快捷键及实用插件等进阶技巧,助你快速上手这款高效的Python IDE。

2026.08.05

2

17

PyCharm运行程序教程大全
PyCharm运行程序教程大全

本专题汇总了PyCharm运行程序的多种方式与详细操作步骤,涵盖通过主菜单Run、点击工具栏绿色三角图标、使用快捷键Shift+F10(或Ctrl+Shift+F10)等基本运行方法,以及配置运行/调试参数、设置PYTHONPATH环境变量、管理多脚本运行与交互式Python控制台调试等进阶技巧,助您全面掌握在PyCharm中高效运行与管理Python程序的方法。

2026.08.05

0

14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

C# 教程
C# 教程

共94课时 | 20.2万人学习