直接使用nlohmann/json库实现JSON与C++对象互转:下载单头文件json.hpp包含即可;解析用json::parse()并捕获异常;取字段优先用.value()或.contains()避免崩溃;序列化用.dump()控制格式;自定义类型需ADL支持。

直接用 nlohmann/json,别自己手写解析器——它把 JSON 的序列化/反序列化变成了 C++ 原生对象的赋值和读取。
怎么装 nlohmann/json(单头文件,不编译)
它本质就是一个 nlohmann/json.hpp 文件,没有构建步骤:
- 去 GitHub 下载最新 release 的单文件:https://github.com/nlohmann/json/releases(找
json.hpp) - 放进项目目录(比如
include/nlohmann/json.hpp),然后在代码里#include - 确保编译器支持 C++11(最低要求),推荐 C++17 或更高
- 不需要链接任何库,也不需要 cmake find_package —— 它是 header-only
怎么把 JSON 字符串转成 C++ 对象(parse)
核心是 nlohmann::json 类型,它能自动推导结构。常见错误是忽略异常:
- 用
nlohmann::json::parse()解析字符串,失败会抛nlohmann::json::parse_error - 别直接
nlohmann::json j = "{...}";—— 这会调用字符串构造函数,不是解析,结果是字符串字面量 - 正确写法:
auto j = nlohmann::json::parse(json_str);,json_str是std::string或 C 风格字符串 - 如果输入不可信(如网络响应),必须 try/catch:
try { auto j = json::parse(s); } catch (const json::parse_error& e) { /* e.what(), e.byte */ }
怎么从 json 对象里取字段(避免 runtime_error)
字段不存在时默认行为是抛 nlohmann::json::type_error 或 out_of_range,不是返回空或 nullptr:
立即学习“C++免费学习笔记(深入)”;
- 安全访问用
.value("key", default_value),例如j.value("age", 0),类型必须匹配(int、std::string等) - 检查字段是否存在用
j.contains("key"),返回 bool - 强制取值(带断言)用
j["key"],但一旦 key 不存在就崩溃;数组同理,j[i]越界也 crash - 嵌套访问建议链式判断:
j.contains("user") && j["user"].contains("name") ? j["user"]["name"].get<:string>() : "" - 类型转换要显式:
j["count"].get,不能直接() (int)j["count"]
怎么把 C++ 对象转成 JSON 字符串(serialize)
最简场景下直接 .dump(),但要注意格式和精度:
-
j.dump()生成紧凑 JSON(无空格);j.dump(2)生成缩进为 2 的可读格式 - 浮点数默认保留 6 位小数,如需更多,设
j.dump(2, ' ', true, json::error_handler_t::replace)不够,得改json::default_float_precision或用自定义序列化 - 自定义类型要支持 ADL(argument-dependent lookup):在类同名命名空间里定义
to_json(json&, const T&)和from_json(const json&, T&) - 注意循环引用:
json不检测对象自引用,会无限递归导致栈溢出
真正麻烦的从来不是“怎么写”,而是字段名拼错、类型假设错误、没处理缺失字段、或者把 parse 和构造函数混用——这些地方一出错,报的都是运行时异常,编译器拦不住。










