c++中json5需借助json5-parser-cpp与nlohmann/json组合解析,因标准库及主流json库均不原生支持json5语法(如注释、单引号、尾随逗号等),直接使用nlohmann::json::parse会报错;json5::parse先将json5转为标准json再交由nlohmann处理,且需注意bom、换行符及unicode转义兼容性问题。

JSON5在C++里没有标准库支持
标准C++库(包括std::json)完全不识别JSON5——它压根不是ISO/IEC标准,而是JSON的非官方扩展。你用std::nlohmann::json或boost::json直接加载.json5文件,大概率会遇到parse_error,比如注释里的//、尾随逗号,、单引号字符串'key': 'value',全都会触发解析失败。
nlohmann/json + json5-parser-cpp 是最轻量可行组合
目前唯一被广泛验证能跑通JSON5的C++方案,是用nlohmann::json作为底层数据结构,再套一层开源的json5-parser-cpp(GitHub上由@zhihengli维护)。它把JSON5文本先转成标准JSON字符串,再交给nlohmann解析。
实操要点:
- 必须用
json5-parser-cpp的json5::parse()函数,不能跳过它直接喂给nlohmann::json::parse() -
json5::parse()返回的是nlohmann::json对象,后续操作和普通JSON完全一致 - 注意编译时链接顺序:先编译
json5-parser-cpp源码(它只有头文件+一个json5.cpp),再链接nlohmann/json - 常见坑:
json5::parse()对Unicode转义支持有限,比如\u{1F600}(emoji大括号形式)会失败,得换成\uD83D\uDE00
#include "json5.hpp"
#include "nlohmann/json.hpp"
<p>std::string input = R"({
// 这是注释
name: 'Alice',
age: 30,
tags: ['cpp', 'json5'],
})";</p><p>try {
nlohmann::json j = json5::parse(input); // ✅ 正确入口
std::cout () </p>
为什么不用RapidJSON或simdjson
这两个库性能强,但都不原生支持JSON5。有人试过在RapidJSON前加正则预处理(删注释、补引号),结果不稳定:正则无法正确处理字符串内的//或/* */,也搞不定单引号嵌套、无引号键名等语法糖。simdjson更激进——它连标准JSON的宽松模式都拒绝,遇到尾随逗号直接abort。
所以硬要塞进去,等于自己重写一个JSON5 tokenizer,工作量远超引入json5-parser-cpp。
生产环境要注意路径和编码
JSON5文件若从磁盘读取,别忽略BOM和换行符问题:
- Windows记事本保存的UTF-8带BOM,
json5::parse()会把BOM当非法字符报错,读文件后需手动strip开头的\xEF\xBB\xBF - 文件含Windows CRLF(
\r\n)没问题,但若混用\r(旧Mac格式),部分版本json5-parser-cpp会卡在行号计算上 - 所有键名和字符串值默认按UTF-8解释,不要用
std::locale强行切换codecvt——它在C++17已被弃用,且和json5-parser-cpp内部逻辑冲突
真正麻烦的从来不是语法解析,而是你拿到的那个config.json5,可能来自设计师随手保存的Notepad++,也可能来自前端打包工具输出——这些来源的编码和换行习惯,比JSON5语法本身更难统一。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










