用 nlohmann/json 处理 C++ JSON:单头文件三步跑通的完整实践
【免费下载链接】jsonJSON for Modern C++项目地址: https://gitcode.com/GitHub_Trending/js/json
写 C++ 程序要读配置文件、要解析接口返回的字符串,迟早会碰到 JSON。可大多数 C++ JSON 库要么集成麻烦,要么 API 学习成本高。nlohmann/json 是一个单头文件的 C++ JSON 解析与序列化库,复制一个头文件进项目,就能完成解析、输出和自定义类型转换。
什么是 nlohmann/json
nlohmann/json 的口号是 JSON for Modern C++,用 C++11 实现,目标是让 JSON 用起来像内置类型。
它适合想快速给 C++ 项目加 JSON 支持、又不想折腾构建系统的开发者。当前仓库版本为 v3.12.0。
你能直接感知的收益:
- 整个库就是
single_include/nlohmann/json.hpp一个头文件,无编译、无依赖 - API 是 STL 容器风格,会用
std::map就会用它 - 单元测试覆盖率 100%,并用 Valgrind、Clang Sanitizers 和 Google OSS-Fuzz 做了持续检测
它的使用范围可以从仓库里的客户名单看出,Blender、MySQL、QGIS、Siemens 等产品都在用。
三步跑通第一个 JSON 程序
第一步,拿到头文件。clone 仓库后,库本体在single_include目录里。
git clone https://gitcode.com/GitHub_Trending/js/json第二步,写一个最小示例,它演示了创建对象并输出缩进 JSON。
#include <nlohmann/json.hpp> using json = nlohmann::json; int main() { json j = {{"name", "demo"}, {"value", 42}}; std::cout << j.dump(2) << std::endl; }第三步,加头文件路径编译并运行。
g++ -std=c++11 -I json/single_include demo.cpp -o demo && ./demo运行后你会看到两行缩进的 JSON 输出。整个过程没有 CMake、没有第三方依赖,只需要一个支持 C++11 的编译器。
三个值得了解的核心能力
解析与输出,两行代码搞定
把 JSON 字符串转成对象、再把对象转回字符串,是这个库最高频的用法。
json j = json::parse(R"({"name": "demo", "value": 42})"); std::cout << j.dump(2) << std::endl;parse负责反序列化,dump负责序列化,传一个参数就能输出带缩进的美化结果,写配置文件时很省事。
自定义结构体序列化,写一个函数就够
想让自己的 struct 自动变成 JSON,只需实现一对函数。
void to_json(json& j, const Person& p) { j = {{"name", p.name}, {"age", p.age}}; } json j = p;实现to_json后json j = p;直接生效,反序列化再写一个from_json即可,不需要逐字段手动赋值。相关宏的写法见 官方特性文档。
JSON Pointer 与二进制格式
访问深层嵌套字段时,不用写一串[],直接用 JSON Pointer 定位。也可以转成二进制格式传输。
auto k = j.at("/name"_json_pointer); auto v = json::to_msgpack(j);Pointer 支持 RFC 6901 路径语法,配合 JSON Patch 还能对对象做增量修改。库同时支持 MessagePack、CBOR、UBJSON、BSON、BJData 五种二进制格式的互相转换。
与同类工具的取舍
选型主要看两个场景。你的代码是普通业务逻辑,读配置、解析接口返回,那 nlohmann/json 是最省事的:单头文件、STL 风格 API,上手成本最低。如果你的程序是解析密集型的,比如一次要解析上 GB 的数据、解析耗时占了 CPU 大头,那应选 RapidJSON 这类专用高性能库。
| 维度 | nlohmann/json | RapidJSON |
|---|---|---|
| 集成方式 | 单头文件,无构建 | 需引入源码并编译 |
| API 风格 | STL 容器式,接近 Python | DOM/回调式,写法更啰嗦 |
| 解析速度 | 中等(约 72ms) | 第一梯队(约 8ms) |
速度差距来自第三方基准测试 nativejson-benchmark 的解析时间对比,图中 nlohmann 位于中游。
nativejson-benchmark 各 JSON 库解析时间对比,nlohmann 约 72ms 处于中游.png)
结论很简单:开发效率和代码量优先,选 nlohmann/json;解析性能是核心瓶颈,选 RapidJSON。
常见坑与疑问
问:必须用 CMake 才能集成吗?
不是。头文件加进工程、-I指向single_include就能编译。团队项目也可以走包管理器,vcpkg、Conan、Homebrew 里都有nlohmann_json目标,集成文档里有各方案的具体配置。
问:大文件解析会不会慢到不可用?
对多数业务代码不会。基准测试里它的解析耗时约 72ms,属于中游水平。只有当 JSON 解析本身成为 CPU 热点时,才需要换专用高性能库。
问:解析失败或缺少字段怎么处理?
json::parse第二个参数传nullptr、第三个参数传false,失败时不抛异常而是返回 discarded 值。读字段时优先用j.value(key, 默认值),缺键时返回默认值,能少写很多 try/catch。更多问题见 官方 FAQ。
小结
如果你希望用最小成本给 C++ 项目加上 JSON 支持,nlohmann/json 值得优先尝试:单头文件、STL 风格 API、复制即可用。它适合从配置读取、接口解析到二进制序列化的绝大多数场景。官方 FAQ 在 docs/mkdocs/docs/home/faq.md,功能文档在 docs/mkdocs/docs/features/。
【免费下载链接】jsonJSON for Modern C++项目地址: https://gitcode.com/GitHub_Trending/js/json
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考