☰
用 nlohmann/json 处理 C++ JSON:单头文件三步跑通的完整实践
2026/10/18 21:28:47 网站建设 项目流程

用 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/jsonRapidJSON
集成方式单头文件,无构建需引入源码并编译
API 风格STL 容器式,接近 PythonDOM/回调式,写法更啰嗦
解析速度中等(约 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询