nlohmann/json 构造数组最省事:std::vector 直接赋值,原始数组用 std::begin/end 或迭代器范围构造,std::array 可直接使用,避免裸指针和手动拼接字符串。

用 nlohmann/json 直接构造数组对象最省事
第三方库 nlohmann/json 是 C++ 里处理 JSON 最自然的选择,它把 C++ 容器映射成 JSON 类型几乎零学习成本。你不需要手动拼字符串、也不用写循环转义,只要把 std::vector 或原始数组包装进 json 对象就行。
常见错误是试图用 char* 数组直接赋值,比如 j["data"] = arr;(arr 是 int[5]),这会触发隐式转换失败或编译报错——nlohmann/json 不接受裸指针。
- 原始数组要先转成
std::vector或用std::begin/std::end辅助构造:int arr[] = {1, 2, 3}; json j = json(std::begin(arr), std::end(arr)); - 如果是
std::vector<int></int>,直接赋值即可:j["values"] = vec; - 嵌套数组也一样支持:
j["matrix"] = std::vector<:vector>>{{1.1, 2.2}, {3.3, 4.4}};</:vector>
原始数组没 vector 怎么办?用 std::array 或显式迭代
如果项目禁用 std::vector(比如嵌入式场景),又必须用固定大小数组,优先选 std::array ——它有迭代器且能被 nlohmann/json 直接识别。裸 int[N] 没类型信息,必须手动展开。
-
std::array<float> a = {1.0f, 2.0f, 3.0f}; json j = a;</float>✅ 可行 - 裸数组需配合范围构造:
int raw[4] = {10, 20, 30, 40}; json j = json(raw, raw + 4); // 注意:第二个参数是 end 迭代器,不是长度 - 别用
sizeof(raw)/sizeof(*raw)算长度再传进去——nlohmann/json的构造函数不接受长度参数,只认迭代器对
自己序列化?除非有极端约束,否则别碰
手写 JSON 字符串生成器看似可控,实则极易出错:中文没 UTF-8 转义、浮点数精度丢失、null 和空字符串混淆、嵌套引号漏转义……这些在 nlohmann/json 里都已解决。
唯一可能需要绕过库的场景是:目标平台连 STL 都不支持,且数组元素全是整数/布尔/简单字符串。即便如此,也建议只做最简封装:
- 用
std::to_string转数字,但注意负数和边界值(如INT_MIN) - 字符串内容必须双引号包裹,并替换
"为"""、为"\ " - 结尾逗号问题:循环中判断是否最后一个元素,避免多加逗号导致 JSON 解析失败
输出时要注意缩进、编码和 const 限定
nlohmann/json 默认输出紧凑格式(无空格无换行)。调试时想看可读结构,调用 .dump(2);生产环境通常用 .dump() 减少体积。
容易被忽略的点:
- 返回值是
std::string,不是 C 风格字符串 —— 别直接传给printf("%s", j.dump().c_str()),万一字符串含

