尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

C++ JSON 库 nlohmann/json 怎么集成:3 步用单头文件跑通第一个 JSON 读写

C++ JSON 库 nlohmann/json 怎么集成:3 步用单头文件跑通第一个 JSON 读写 C JSON 库 nlohmann/json 怎么集成3 步用单头文件跑通第一个 JSON 读写【免费下载链接】jsonJSON for Modern C项目地址: https://gitcode.com/GitHub_Trending/js/jsonnlohmann/json 是一个 C JSON 解析库官方副标题叫 JSON for Modern C。它做的事很直接把 JSON 文本解析成 C 对象把对象序列化回 JSON 字符串顺带支持 CBOR、BSON 等二进制编码。整个库只有一个头文件json.hpp拷进项目就能编译不用配置任何依赖。它替你省掉的麻烦是手写逐字段解析代码、在 CMake 里折腾第三方库、为JSON 到底该用哪个库反复纠结。一图看懂nlohmann/json 在你的项目里处于什么位置它在数据流里的位置一句话能说清外界给你 JSON 字符串接口响应、配置文件、消息体它负责字符串与 C 内存对象之间的双向转换你的业务代码只面对一个json类型。怎么把 nlohmann/json 集成进项目拷贝一个文件就编译解决什么问题你刚接一个后端需求要读一个配置文件。拉一个带构建脚本的第三方库配 CMake、管版本号、处理子模块比写业务代码还花时间。为什么能做到它是 header-only 设计——所有实现都写在头文件模板里没有需要预先编译的 .cpp。C11 是基线CMake 里只要求cxx_std_11GCC、Clang、MSVC 都能直接编。单文件版本放在single_include/nlohmann/json.hpp约 2.7 万行相当于把整个工具箱装进口袋拷过去就能用。看一眼就懂全部集成动作就是这两行#include nlohmann/json.hpp加一行别名using json nlohmann::json;怎么用一个变量接住任意 JSON 值解决什么问题你写接口客户端返回体的字段经常变有时count是数字有时整个字段不存在有时嵌套层级加深一层。为每种情况定义一个结构体代码量比业务逻辑还多。为什么能做到它只有一个类型json内部用一个类型枚举加 union 同时容纳 null、布尔、整数、浮点、字符串、数组、对象等 9 种值。赋值时编译器按右值自动推导该放哪一格读取时用j[pi]、j.getint()这类重载取出。语法接近 Python 的字典写法心智负担很低。看一眼就懂json j; j[pi] 3.141; j[list] {1, 2, 3};三行就建好了嵌套结构。怎么把 C 自定义结构体序列化成 JSON解决什么问题你有个User结构体要发成接口响应。手工写{name: u.name, ...}这类拼键名代码加一个字段就漏改一处。为什么能做到它走 ADL参数依赖查找。你只要在结构体所在命名空间写一对to_json/from_json普通函数赋值和读取时库自动找到它们不用注册、不用继承、不用宏。字段映射关系集中在两个函数里加字段只改这两处。看一眼就懂struct User { std::string name; int age; }; void to_json(json j, const User u) { j json{{name, u.name}, {age, u.age}}; } void from_json(const json j, User u) { j.at(name).get_to(u.name); j.at(age).get_to(u.age); }之后json j user;和User u2 j.getUser();各一行完成往返。怎么读写 CBOR、BSON 等二进制格式解决什么问题你的 C 服务要和 MongoDB 换 BSON、和嵌入式设备或内部 RPC 换紧凑二进制。纯文本 JSON 体积大各语言生态里流行的也不是同一种文本格式手写编解码器不现实。为什么能做到数据模型不变变的只是编码层。同一份json对象可以直接编成 CBOR、MessagePack、BSON、UBJSON、BJData对应的from_*再解回来。选哪个取决于对端生态比如 MongoDB 配 BSON、IoT 配 CBOR而不是按格式清单逐个评估。看一眼就懂json j {{key, value}, {n, 42}}; std::vectorstd::uint8_t cbor json::to_cbor(j); json back json::from_cbor(cbor); // back j怎么从零跑通3 步到第一个输出拿到源码clone 仓库或只取单头文件也行git clone https://gitcode.com/GitHub_Trending/js/json把single_include/nlohmann/json.hpp拷到你项目的 include 目录保持nlohmann/子目录结构。写个最小示例#include iostream #include nlohmann/json.hpp using json nlohmann::json; int main() { json j {{name, demo}, {tags, {c, json}}}; std::cout j.dump(2) std::endl; return 0; }编译运行g -stdc11 -I single_include main.cpp -o demo ./demo输出是一个两行缩进的对象name: demo和两元素数组。CMake 项目也可以直接add_subdirectory引入仓库链接nlohmann_json::nlohmann_json目标省去手动拷文件。怎么读一个 JSON 配置文件并回写一个完整场景场景你的服务启动时读config.json运行中要改日志级别改完落盘。假设文件里有port、host但没有log_level字段——这正是新手最容易崩的地方下面按输入、处理、输出走一遍。输入config.json里只有{host:10.0.0.2,port:8080}。处理用流读入字段一律走.value(键, 默认值)缺字段时用默认值而不是抛异常std::ifstream in(config.json); json config; in config; int port config.value(port, 8080); std::string host config.value(host, 127.0.0.1); std::cout host : port std::endl; config[log_level] info; // 新增字段 std::ofstream out(config.json); out config.dump(4); // 4 空格缩进写回输出先打印10.0.0.2:8080文件被重写成 4 空格缩进的 3 字段对象。注意两个细节in config解析失败会抛parse_error生产代码要 try-catch写回用dump(4)而不是dump()否则整份配置挤成一行diff 没法看。选型判断哪些场景该用哪些场景别用适合中小型服务端、工具类程序、配置与接口数据处理。判断标准就三条——迭代速度优先、团队不全是 C 老手、对单库维护成本敏感。单头文件意味着升级就是换文件版本冲突风险极低C11 基线意味着十年内的编译环境都能跑。不建议用解析速度卡进热点循环的场景。游戏服务器每帧解析消息、网络库内嵌解码这类场景请选 RapidJSON 这类面向性能专门设计的库。仓库自带 tests/reports/ 下的第三方 benchmark 记录解析吞吐上它就是不是第一梯队官方也没回避。编译时间受限的场景。2.7 万行的头文件会在每个包含它的编译单元展开大工程里编译耗时会可感知地增加。超大文件一次性进内存的场景。它是把整个文档解析成内存树几百 MB 的 JSON 文件不适合直接喂给它。四个常见坑和规避方式j[不存在的键]会顺手创建该键。读路径别用[]改用j.at(键)缺键抛out_of_range或j.value(键, 默认值)缺键给默认值。重复键被静默覆盖。RFC 8259 允许重复键后者生效。需要严格校验时给parse传 parser callback仓库 示例代码目录 里的reject_duplicate_keys.cpp就是现成写法。getT()类型不匹配直接抛异常。数字存的是 int64/uint64/double 三档之一取之前先看is_number_integer()/is_number_float()别猜。对象键是字典序不是插入序。底层默认用std::mapdump出来按字母排。要保序就换nlohmann::ordered_jsonAPI 完全一样。资源指引接下来按什么顺序看single_include/nlohmann/json.hpp单文件版本体直接拷走就能用无需其他文件。示例代码目录每个 API 都配一对.cpp和.output对着预期输出跑是最快的学法。特性文档解析、序列化、二进制格式、JSON Pointer 按主题分章查行为细节比翻头文件快。测试源码目录70 多个 unit 测试文件边界行为Unicode、异常、迭代器失效怎么表现这里都有标准答案。README官方快速上手与特性总览五分钟能读完。【免费下载链接】jsonJSON for Modern C项目地址: https://gitcode.com/GitHub_Trending/js/json创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表