直接合并JSON片段易产生非法语法,需先识别类型({为对象,[为数组),清除BOM/空白,再按目标结构合并:全对象用update(),全数组用push_back(),混合则封装为新对象。

直接合并多个 JSON 片段不等于得到合法 JSON 文件——最常见错误是拼出 [{...}]{...} 这类语法非法结构。关键在识别每个片段的类型(对象/数组)并统一顶层容器。
判断输入片段是 JSON 对象还是数组
很多同学直接用 std::string 拼接,结果解析失败。先看首字符:以 { 开头是对象,[ 开头是数组。别依赖文件名或注释——JSON 规范只认内容。
- 用
jsoncons可快速探测:json::is_object()或json::is_array() - 用
nlohmann::json时,构造后调用.is_object()/.is_array() - 如果片段含 BOM 或空白前缀(如
\ufeff{...}),需先 trim + strip BOM,否则parse()报parse_error
合并策略取决于目标格式
没有“通用合并”——你得明确输出要什么结构。常见三种场景:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 所有片段都是对象 → 合并为单个对象:
json result = json::object(); for (auto& j : fragments) { result.update(j); }(注意键冲突会覆盖) - 所有片段都是数组 → 合并为大数组:
json result = json::array(); for (auto& j : fragments) { for (auto& item : j) result.push_back(item); } - 混合类型(如一个对象 + 一个数组)→ 必须封装成新对象,例如:
{"data": [...], "meta": {...}},硬拼会非法
用 nlohmann::json 写入时的编码与换行控制
默认 json.dump() 输出紧凑格式,但生成可读文件需手动控制缩进;更重要的是 Windows 下若用 std::ofstream 默认 ANSI 编码,中文字段会变乱码。
立即学习“C++免费学习笔记(深入)”;
- 写入前设 UTF-8:打开文件流时加
std::ios::binary,再用file 写 BOM(仅 Windows 记事本需要) - 美化输出:用
json.dump(2)(参数 2 表示 2 空格缩进),不要用dump(-1)——它不加换行,和紧凑模式一样 - 避免
std::endl:它强制 flush,小文件无所谓,批量处理时换成'\n'更快
最易被忽略的是片段间隐式分隔符——比如日志中截取的 JSON 常带前后空行或逗号,不清理就 parse 会报 invalid value。实际处理前,对每个字符串做 std::regex_replace(s, std::regex(R"(^\s+|\s+$)"), "") 是稳妥做法。


















