c++解析json文件方法 c++如何实现读取json文件

风磊大大_5762

风磊大大_5762

2026-03-19

523人浏览

原创

nlohmann/json是c++事实标准json库,纯头文件使用,需正确包含json.hpp并用parse_file()读文件、at()安全访问字段,注意utf-8编码与异常处理。

c++解析json文件方法 c++如何实现读取json文件

用 nlohmann/json 读取 JSON 文件最省事,但得先装好头文件

不推荐手写解析器,C++ 标准库至今没原生 JSON 支持。第三方里 nlohmann/json 是事实标准:头文件即用、语法接近 Python、错误提示还算友好。它不是系统级依赖,不用编译安装,下载单个 json.hpp 放进项目目录就能 #include。

常见错误现象:undefined reference to `nlohmann::detail::parse_error::create —— 这是误用了源码编译方式(比如把 .cpp 当成 .hpp 引入),nlohmann/json 必须纯头文件使用,不能链接对象文件。

  • 确保 #include <nlohmann></nlohmann> 路径正确,不是 <json.hpp></json.hpp>
  • 如果用 CMake,别写 find_package(nlohmann_json) 后又手动加头文件路径,容易冲突
  • C++17 起建议开启 -std=c++17,否则某些嵌套结构推导可能报错

json::parse() 和 json::parse_file() 别混用

json::parse_file() 是 v3.10.0 才加的便利函数,之前版本只有 json::parse()。前者直接读磁盘文件并解析,后者只处理字符串或流——很多人卡在这儿:传了个文件路径字符串给 json::parse(),结果解析出一个带斜杠的字符串对象,不是 JSON 结构。

使用场景:配置文件加载、静态数据初始化;性能上 parse_file() 内部做了内存映射优化,比先 std::ifstream 读全再 parse() 略快,但差异通常可忽略。

  • 安全起见,始终检查异常:try { j = json::parse_file("config.json"); } catch (const json::parse_error& e) { /* 打印 e.what() */ }
  • 路径支持相对路径,但当前工作目录由运行环境决定,不是源码位置
  • UTF-8 编码是硬性要求,含中文的文件必须保存为 UTF-8 无 BOM,否则抛 parse_error

访问嵌套字段时,operator[] 和 at() 行为完全不同

j["user"]["name"] 看着自然,但它是“宽松访问”:键不存在就自动创建空对象,后续赋值才生效。而 j.at("user").at("name") 是严格访问,键缺失直接抛 out_of_range 异常。线上程序崩在 operator[] 上很常见——你以为读到了字段,其实只是新建了个空节点。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

参数差异:两者都支持 string 和 int(数组索引),但 at() 不接受隐式类型转换,比如 j.at(0) 可以,j.at("0") 就不行。

  • 配置读取、API 响应解析等关键路径,一律用 at() + try/catch
  • 临时调试或构建阶段可用 operator[],但别让它出现在条件判断里,比如 if (j["data"]) {...} 永远为真
  • 检查字段是否存在用 j.contains("field"),不是 j["field"].is_null()

中文乱码、浮点精度、大文件内存暴涨都是默认行为惹的祸

默认输出 JSON 会美化缩进、浮点数保留最多 17 位小数、字符串转义所有非 ASCII 字符——这些对调试友好,但对生产环境可能是坑。比如日志里打印 JSON,中文全变成 \u4f60\u597d;或者 3.141592653589793 被存成 3.1415926535897931 导致前后端比对失败。

大文件读取时,nlohmann/json 会一次性加载全部内容到内存,没有流式解析能力。100MB JSON 文件大概吃掉 300MB 内存(JSON 文本 + 解析后对象树)。

  • 关闭 Unicode 转义:j.dump(-1, ' ', false, json::error_handler_t::replace)
  • 控制浮点精度:j.dump(2) 表示小数点后 2 位,但注意这是格式化输出,不影响内部存储
  • 超大文件(>10MB)考虑换 simdjson 或 rapidjson 的 SAX 模式,nlohmann/json 不支持

真正麻烦的是混合编码:Windows 记事本默认 ANSI,Linux 终端默认 UTF-8,跨平台部署时文件编码和程序预期不一致,错误信息里连 parse_error 都可能显示为方块字。这事没法靠代码兜底,得从 CI 流程里卡住文件编码。

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

相关文章

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

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

下载

相关标签:

c++

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

相关专题

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

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

2023.08.07

2095

5

json是什么
json是什么

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

2023.08.23

3162

1

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

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

2023.10.13

1076

3

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

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

2025.09.10

3619

7

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6179

3

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2158

7

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1718

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2604

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6024

49

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习