十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

nlohmann/json:C++ JSON 库 5 分钟上手与选型指南

nlohmann/json:C++ JSON 库 5 分钟上手与选型指南 nlohmann/jsonC JSON 库 5 分钟上手与选型指南【免费下载链接】jsonJSON for Modern C项目地址: https://gitcode.com/GitHub_Trending/js/jsonnlohmann/json 是一个单头文件的 C JSON 库面向需要解析、生成、转换 JSON 数据的 C 开发者。把一个 json.hpp 放进工程就能干活读写配置、处理 API 响应、切换二进制格式不引入构建脚本也不带第三方依赖。 三个真实开发场景读配置。程序从 config.json 取参数个别字段可能缺失改完还要写回文件。传统写法要解析器、手写缺省判断、再手动拼字符串三段代码都不短。对接 API。响应体是一段 JSON 文本先判断有没有 error再取出 result 里的数组逐条处理。类型不对最好当场暴露而不是等线上报警。切换数据格式。今天存 JSON 文本明天设备协议换成 CBOR 或 MessagePack 字节流。库若原生支持多格式改一行 to_/from_ 调用就行不用换库、重写解析层。核心设计单头文件与泛型 API它的关键决定只有两个其余功能都从这两条长出来。其一全部代码合成一个头文件。目录 single_include/nlohmann/json.hpp 就是合并后的成品纯 C11 写成无子项目、无特殊编译选项。引入方式就是 #include或者按 README 的 Integration 一节用 CMake、包管理器安装。其二接口走泛型与值语义。json 是 basic_json 模板类的别名字符串用 std::string、对象用 std::map、数组用 std::vector全是标准库类型所以拷贝、移动、比较都像 std::vector 一样直接。自定义类型靠一对 to_json / from_json 函数接入编译器按 ADL 约定自动查找无需显式注册。对比维度nlohmann/json典型多文件 JSON 库引入成本拷贝一个 json.hpp拉源码、配构建、处理依赖语言标准C11 起头文件即可常需 C11/14 且要编译类型转换ADL 自动查找可选声明式宏多为显式注册二进制格式内置 5 种通常只有文本 JSONnlohmann/json 如何引入项目五分钟上手最短路径是克隆仓库取 single_include 下的头文件各包管理器的安装入口也列在 README 里git clone https://gitcode.com/GitHub_Trending/js/json最小可用示例#include nlohmann/json.hpp using json nlohmann::json; int main() { json j {{name, demo}, {value, 42}}; // 初始化列表构造对象 j[tags] {a, b}; // 追加一个数组字段 std::cout j.dump(2) std::endl; // 缩进 2 格输出 }跑通这段构造、访问、序列化三个基本盘就都有了。 三个高光能力序列化与反序列化json j {{happy, true}, {pi, 3.141}}; std::string s j.dump(); // 紧凑文本 auto k json::parse(s); // 解析回 json 对象 std::cout k.dump(4) std::endl; // 4 格缩进输出dump 不带参数出紧凑文本带整数参数出缩进文本parse 支持字符串、字节容器和 istream 三种输入。同一份数据换二进制格式json j {{key, value}, {number, 42}}; auto mp json::to_msgpack(j); // MessagePack 字节 auto cb json::to_cbor(j); // CBOR 字节 json back json::from_cbor(cb); // 原路还原BSON、UBJSON、BJData 走同一套 to_/from_ 接口切换格式只改函数名。自定义类型转换struct Person { std::string name; int age; }; NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Person, name, age); // 宏展开为 to/from 两函数 Person p{Alice, 30}; json j p; // 序列化 Person q j.getPerson(); // 反序列化不想用宏就按 ADL 约定手写 to_json / from_json效果相同。 C JSON 库选型对比维度nlohmann/jsonRapidJSONJsonCpp引入方式单头文件源码编译源码 CMakeAPI 风格值语义类 Python指针式 DOM/SAX值语义接口较旧解析速度nativejson 基准居中最快档较慢内置二进制格式5 种无无C JSON 库 nlohmann/json 解析耗时基准对比图上图是仓库自带的第三方基准报告2016 年Core i7-4980HQClang 7解析同一份大文件nlohmann/json 约 72msRapidJSON 约 8msJsonCpp 约 166ms。官方 README 也直说——存在更快的库它的取舍是用速度换开发效率。这三类场景建议绕开GB 级文件解析、每帧执行的热路径速度差距明显可考虑 RapidJSON 的 SAX 模式内存受限的嵌入式环境std::map/std::vector 的运行时开销大于 C 语言 DOM 库工程已深度使用 RapidJSON为单头文件而切换的收益有限。避坑与资源入口解析失败是最常碰到的异常两种处理方式try { json j json::parse(R({a: [1, 2})); // 故意少一个 ] } catch (json::parse_error e) { std::cerr e.what() byte e.byte std::endl; }不想进 try/catch 时parse 后两个参数传 nullptr 和 false失败会返回 discarded 值json j json::parse(oops, nullptr, false);再用j.is_discarded()判断。另一个坑对数字节点做getstd::string()这类跨类型取法会抛 type_error先 is_string() 检查再取。入口资源可运行示例docs/mkdocs/docs/examples/ 目录每个 .cpp 都配一份 .output 预期输出API 参考docs/mkdocs/docs/api/ 目录按方法一页一讲测试与质量tests/src/ 存全部单元测试README 说明 Valgrind、Sanitizers 检查与 Google OSS-Fuzz 24/7 模糊测试社区讨论、问答入口列在 README 顶部建议第一步克隆仓库后先编译运行 docs/mkdocs/docs/examples/dump.cpp对照同目录的 dump.output 核对输出再顺着 examples 目录把 JSON Pointer、items 遍历几篇跑一遍。【免费下载链接】jsonJSON for Modern C项目地址: https://gitcode.com/GitHub_Trending/js/json创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表