nlohmann/json支持链式字面量构建,应显式调用json::object()或json::array()避免模板推导失败;写入用operator[](自动创建键),读取用contains()+[]或at()(抛异常);注意数值类型精度和dump()输出。

直接用json::object()和json::array()构造最简单
不需要先定义结构体或类,nlohmann/json 支持链式、字面量风格的构建。核心是把 json 当作万能容器类型来用,它会自动推导类型(字符串、数字、布尔、null、对象、数组)。
常见错误是试图用 C 风格初始化(比如 {{"key", "value"}}),这在 C++17 前容易触发模板推导失败;正确做法是显式调用工厂函数:
json j = json::object({{"name", "Alice"}, {"age", 30}});json arr = json::array({1, "hello", true});- 嵌套也自然:
j["scores"] = json::array({85, 92, 78});
给字段赋值时注意operator[]和at()的区别
operator[] 对不存在的 key 会自动创建并返回一个默认初始化的 json(即 json::value_t::null),适合写入;而 at() 是只读访问,找不到 key 会抛 std::out_of_range 异常。
容易踩的坑:用 at() 给新字段赋值会崩溃,比如 j.at("email") = "a@b.com"; —— 这里 "email" 还不存在,必须先用 j["email"] = ...。
立即学习“C++免费学习笔记(深入)”;
- 安全写入:始终用
j["field"] = value; - 安全读取(带检查):先
if (j.contains("field")) { auto v = j["field"]; },或捕获异常用at() - 避免隐式类型转换陷阱:比如
j["count"] = 42.0;会存成double,不是int;需要整数就写42或强制json(42)
输出 JSON 字符串要调用dump(),别直接std::cout
json 对象本身不能直接流输出(除非你重载了 operator),常见错误是写 <code>std::cout 导致编译失败或乱码。必须显式调用 <code>dump() 转成 std::string。
dump() 默认不缩进,加参数可美化:
-
j.dump()→ 单行紧凑格式 -
j.dump(2)→ 2 空格缩进(推荐调试时用) -
j.dump(-1)→ 换行但不缩进(介于两者之间)
性能提示:生产环境尽量用 dump()(无缩进),因为缩进涉及大量字符串拼接,对大 JSON 影响明显。
中文字符串乱码?确保输入是 UTF-8 编码的std::string
nlohmann/json 完全基于 UTF-8,它不处理编码转换。如果你从 Windows 控制台、旧版文件或 Qt 的 QString 拿到的是 GBK 或 UTF-16 字符串,直接塞进去会导致 JSON 输出乱码或解析失败。
解决路径很明确:所有输入到 json 的字符串,必须是合法 UTF-8 的 std::string。
- 读文件时:用支持 UTF-8 的方式打开(如
std::ifstream+ BOM 判断,或用std::codecvt_utf8转换) - Windows 控制台输入:调用
SetConsoleOutputCP(CP_UTF8)并确保源码保存为 UTF-8 with BOM - Qt 场景:
QString::toUtf8().toStdString()是安全的
一个容易被忽略的点:JSON 标准要求字符串内部不能出现未转义的控制字符(如 \0、\r、\n),nlohmann 会自动转义,但如果你手动拼接字符串再喂给 json,得自己确保干净。


















