资讯动态

C++ JSON 库选型:nlohmann/json 三步上手指南

发布时间:2026/8/27 15:45:30 来源:尧图企业网站定制
C JSON 库选型nlohmann/json 三步上手指南【免费下载链接】jsonJSON for Modern C项目地址: https://gitcode.com/GitHub_Trending/js/json如果你需要在 C 程序里解析或生成 JSONnlohmann/json项目自称 JSON for Modern C是一个值得优先考虑的 C JSON 库。它的整个实现集中在一个头文件里没有第三方依赖把读取配置、处理 API 响应、持久化数据这类日常需求都压缩成了几行直观的代码。本文按先跑通、再进阶、最后看生态的顺序带你把这个库过一遍。 场景切入程序要读一份 JSON 配置假设你的工具启动时要加载config.json运行时再把它回写成格式化的文件。用 nlohmann/json 的写法大致是这样json j; std::ifstream in(config.json); in j; // 流式解析 std::ofstream out(pretty.json); out std::setw(4) j std::endl; // 4 空格缩进写出nlohmann::json这一个类型同时容纳了对象、数组、字符串、数字、布尔和 null不需要像某些库那样为每种类型准备不同的 API。字符串序列化用dump()反序列化用parse()还支持带回调的分层解析。完整的行为示例可以在 examples 目录 里按 API 逐个找到对应的可运行代码。三步集成 nlohmann/json 到工程第一步拿到头文件。有两种方式。直接把single_include/nlohmann/json.hpp这个 amalgamated 文件拷进你的 include 目录或者 clone 整个仓库git clone https://gitcode.com/GitHub_Trending/js/json第二步配置包含路径。CMake 下最简单的是add_subdirectory后链接官方 target头文件-only 模式下不产生任何编译单元。第三步写代码。包含头文件并用别名简化#include nlohmann/json.hpp using json nlohmann::json; json j {{name, config}, {version, 1}};至此项目里就能解析、构造、输出 JSON 了全程没有额外的库要管理。 像操作字典一样读写 JSON构造对象和数组用的是类 Python 字典语法嵌套对象不用一层层声明json j; j[pi] 3.141; j[name] Niels; j[answer][everything] 42; j[list] {1, 0, 2}; for (auto [key, value] : j.items()) { // C17 结构化绑定 std::cout key : value \n; }序列化与反序列化同样短。dump(4)输出美化后的字符串parse从字符串还原如果格式不合法且未关闭异常会抛出带字节位置的parse_error方便定位坏数据在哪一行。std::string s j.dump(4); // 美化字符串 json j2 json::parse(s); // 字符串还原 try { json bad json::parse({oops}); } catch (json::parse_error e) { std::cerr e.what() byte e.byte \n; }类型访问用getT()强转用value()给可能缺失的键兜底这两句就能覆盖大部分读配置代码json o {{count, 3}}; int c o.value(count, 10); // 键存在得 3 int dflt o.value(missing, 10); // 键缺失得 10进阶能力Pointer、Patch 与错误降级三个进阶特性一句话带过。JSON Pointer 让你用/a/b/0这样的路径字符串直接取嵌套值库内置了_json_pointer字面量JSON Patch 支持按 RFC 6902 对文档执行 add、remove、replace 操作序列适合做增量更新。另外parse可以关闭异常、把失败结果标记为 discarded适合在不可信输入的场景里做静默降级。如何把自定义结构体转成 JSON给结构体定义两个自由函数ADL 会替你完成剩余工作struct Person { std::string name; int age; }; void to_json(json j, const Person p) { j json{{name, p.name}, {age, p.age}}; } void from_json(const json j, Person p) { j.at(name).get_to(p.name); j.at(age).get_to(p.age); } Person p json{{name, Alice}, {age, 30}}.getPerson();写好后json j p;和p j.getPerson();都自动成立。枚举类型则用NLOHMANN_JSON_SERIALIZE_ENUM宏登记枚举值—字符串映射序列化结果对人类可读比输出裸数字友好得多。二进制格式支持与性能除了文本 JSON库内置了五类二进制格式的序列化接口都是同一风格格式序列化入口定位MessagePackjson::to_msgpack高效 RPC 传输CBORjson::to_cborIoT 等紧凑场景UBJSON / BJDatajson::to_ubjson/to_bjdata通用二进制 JSONBSONjson::to_bson对接 MongoDB 生态json j {{key, value}, {n, 42}}; auto mp json::to_msgpack(j); // 转 MessagePack auto cb json::to_cbor(j); // 转 CBOR json back json::from_msgpack(mp); // 无损还原nlohmann/json 与其他 C JSON 库解析耗时性能对比图.png)官方仓库的基准报告显示它在同类头文件库里的解析速度处于第一梯队且每个对象只比标准容器多一个类型标记的开销序列化路径支持移动语义避免大文档拷贝。 谁在用以及如何通过包管理器安装这个库出现在不少知名开源与商业项目的依赖里团队集成时也可以走包管理器省去手工维护头文件的麻烦渠道命令vcpkgvcpkg install nlohmann-jsonConanconan install --requiresnlohmann_jsonHomebrewbrew install nlohmann-jsonAPTapt-get install nlohmann-json3-devCMake 用户也可以FetchContent拉取指定 tag 后链接nlohmann_json::nlohmann_jsontarget版本锁定更省心。快速上手把这件事压缩成最短路线取single_include/nlohmann/json.hpp加入 include 路径#include后定义using json nlohmann::json;用parse读、dump写、items()遍历自定义类型补两个to_json/from_json。API 细节查 官方文档 即可。对一个日常项目来说这个库的覆盖面是够用的。【免费下载链接】jsonJSON for Modern C项目地址: https://gitcode.com/GitHub_Trending/js/json创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价