C++ JSON 库实战指南:十分钟上手 nlohmann/json,从第一次解析到进阶用法
C JSON 库实战指南十分钟上手 nlohmann/json从第一次解析到进阶用法【免费下载链接】jsonJSON for Modern C项目地址: https://gitcode.com/GitHub_Trending/js/json对接 API、读配置文件时最折磨人的往往是那几行 JSON手写解析容易出错引入一堆依赖又嫌重。C JSON 库 nlohmann/json全称 JSON for Modern C就是为这件事设计的零依赖整个库就是一个json.hpp头文件C11 标准直接编译语法直觉到像在写原生 C 类型。下面按先跑起来 → 再干活 → 最后用好的顺序带你走一遍。起步如何在 C 里完成第一次 JSON 解析它的使用方式是头文件即库把单个头文件放进工程仓库里在 single_include/nlohmann/json.hpp然后#include就行不需要编译任何 .lib。下面这段代码做三件事解析一段 JSON 字符串、取一个值、把结果美化打印出来——这就是 80% 场景的全部流程。#include nlohmann/json.hpp using json nlohmann::json; int main() { json data json::parse(R({name: Alice, age: 30})); std::string name data[name]; // 取值像访问 map 一样自然 std::cout data.dump(2) std::endl; // 转回字符串参数 2 是缩进空格数 } 结果name拿到Alicedump(2)输出带两格缩进的多行 JSONdump()不带参数则是紧凑的单行格式适合直接发请求。库把六种 JSON 类型都映射成了 C 里最熟悉的东西nullptr对应 nullbool对应布尔int64_t/double对应数字std::string对应字符串数组和对象分别落在std::vector和std::map的语义上。会用它基本就等于会用它。高频操作日常 JSON 的四件事取数据下标、at()、value() 怎么选大白话三种读法安全性递增按信不信得过数据来选。json data {{user, {{name, Alice}, {age, 30}}}}; std::string name data[user][name]; // 下标最顺手的写法 int age data.at(user).at(age); // at()键不存在时抛 out_of_range int city data[user].value(city, -1); // value()键不存在时返回默认值 -1 bool ok data.contains(user); // contains()只问在不在不抛异常注意一个常见坑对对象用下标访问一个不存在的键库会顺手给它造一个 null 条目所以读外部数据时先用contains()探一下或直接改用at()/value()代码会更干净。改数据增、删、遍历数组和对象共用一套容器式接口增删和遍历都符合 STL 的习惯。json arr {1, 2, 3}; arr.push_back(4); // 尾部追加 arr.emplace_back(5); // 原位构造少一次拷贝 arr.erase(1); // 按索引删元素 json obj {{a, 1}}; obj.emplace(b, 2); // 对象里新增键值对 obj.erase(a); // 按键删除 for (auto [key, value] : obj.items()) { // C17 结构化绑定 std::cout key value \n; }items()返回的条目里key和value都是引用循环里可以直接改值对象遍历天然有序按键排序数组则保持插入顺序。如何把 JSON 写入文件读写文件走的就是标准的流操作符和读写int没区别。std::ifstream in(config.json); json data; in data; // 读入并解析 std::ofstream out(out.json); out std::setw(2) data; // std::setw 指定缩进不写就是紧凑格式⚠️ 注意setw()只影响美化输出的缩进不影响内容合法性解析失败时异常会沿流抛出所以外部文件建议套一层 try/catch下一节讲兜底模式。如何在 JSON 和 C 类型之间转换类型检查用is_*()系列取值转换用getT()或get_to()失败都会抛type_error而不是给你个垃圾值。json value 42; bool is_num value.is_number(); // 先问类型 int i value.getint(); // 显式转换 double d value.getdouble(); std::vectorstd::string tags; json j {{tags, {cpp, json}}}; j.at(tags).get_to(tags); // 结果直接落到已有变量里省一步构造getT()适合确认类型后取值get_to()适合目标类型已确定原地写入不确定类型时先用is_array()/is_object()/is_number_integer()之类探一下再决定怎么取。进阶三个到用时才需要的功能什么时候需要 JSON Pointer 和 JSON Patch当数据套了很多层、路径又来自配置或网络时手写的a[b][0][c]会很难维护。JSON PointerRFC 6901把路径写成一个字符串比如/obj/arr/1JSON PatchRFC 6902则能自动算出两份文档差在哪、怎么改过去。json data {{obj, {{arr, {1, 2, 3}}}}}; int second data[/obj/arr/1_json_pointer]; // 下标换成路径字符串得 2 json source {{a, 1}, {b, 2}}; json target {{a, 4}, {c, 3}}; json patch json::diff(source, target); // 生成 RFC 6902 补丁 source.patch_inplace(patch); // 应用后 source targetdiff()patch_inplace()这对组合在版本同步、增量更新、撤销重做类场景里特别顺手只想按路径取值的话一个_json_pointer字面量就够用了。如何让自己的 struct 接入 JSON想让Person这种自定义类型直接赋值给json、又能getPerson()还原只需要在类型旁提供一对to_json/from_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); } json j Person{Alice, 30}; // 自动序列化 Person back j.getPerson(); // 自动反序列化最小版本里只放两个必填字段即可字段多时用j.value(xxx, 默认值)替代at()可以为缺省字段留后路。实现细节都在 include/nlohmann/ 源码目录里想深究可以看adl_serializer.hpp。需要减小体积和加速时才看二进制格式JSON 是文本键名要完整写出来网络传多了心疼流量时可以换成二进制格式MessagePack、CBOR、BSON、UBJSON 都内置支持接口都是to_xxx/from_xxx一对。json original {{compact, true}, {schema, 0}}; auto mp json::to_msgpack(original); // 通常比文本 JSON 小 30%~50% json back json::from_msgpack(mp); // 反序列化回 json无损往返 选型建议对内传输、本地存储用 MessagePack 或 CBOR体积小、解析快对接 MongoDB 生态用 BSON其余场景老老实实用文本 JSON可读性就是最大的优点。顺带一提它对标准 JSON 的遵循程度第三方合规性横评里 nlohmann 的得分在 96% 一档见上图加上仓库 tests/src/ 里上百个单元测试文件持续把关喂给它的格式基本可以放心。避坑解析报错时先看这 3 类异常这个库出错就抛异常不静默吞错。异常分四类看到异常类型基本就能定位原因parse_errorJSON 语法本身不合法少了引号、多个逗号type_error类型转换失败把对象当int取out_of_range访问了不存在的键或数组下标other_error其他杂项错误工程里推荐一种兜底模式解析放在 try 里失败时返回一个空对象而不是让程序崩掉取具体字段时统一走value()要默认值。json load(const std::string text) { try { return json::parse(text); } catch (const json::parse_error) { return json::object(); // 解析失败 → 空对象 } } json data load(maybe_bad_text); int age data.value(age, 0); // 键缺失 → 默认值 0这套组合拳的要点只有一个外部数据永远假设它会出错用异常划清边界用默认值消化日常的小缺失。最后说三句第一nlohmann/json 的核心卖点就是零依赖 单头文件 直觉语法引入成本几乎为零这让它成为 C JSON 库里最省心的选择。第二日常八成需求只需parse/dump/ 下标访问 /value()这几样剩下两成再按需解锁 JSON Pointer、自定义类型和二进制格式。第三把解析套 try、取值给默认值变成肌肉记忆线上问题会少一大半。想继续深入可以从官方文档目录 docs/ 和源码入口 include/nlohmann/ 开始——前者有完整的 API 说明后者配合单元测试读起来会快很多。【免费下载链接】jsonJSON for Modern C项目地址: https://gitcode.com/GitHub_Trending/js/json创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

PPT Master:3步生成可编辑SVG演示文稿的AI工具

PPT Master:3步生成可编辑SVG演示文稿的AI工具

PPT Master:3步生成可编辑SVG演示文稿的AI工具 【免费下载链接】ppt-master AI turns documents or topics into real, native PowerPoint decks—with native shapes, transitions and animations, data-backed charts and tables on demand, audio narration from…

2026/10/26 11:07:02 阅读更多 →
滴滴出行2018校招内推笔试复盘:计算机视觉与智能交互方向

滴滴出行2018校招内推笔试复盘:计算机视觉与智能交互方向

美团出行(原滴滴出行)2018校园招聘内推笔试经验谈:计算机视觉与智能交互方向转眼间又到了校园招聘的季节。最近有不少学弟学妹问我关于出行行业算法岗笔试面试的事情,尤其是2018年那场内推笔试,计算机视觉研发和智能交…

2026/10/25 16:16:52 阅读更多 →
Vorssaint快速切换:一键深浅模式、清空废纸篓、锁定屏幕

Vorssaint快速切换:一键深浅模式、清空废纸篓、锁定屏幕

Vorssaint快速切换:一键深浅模式、清空废纸篓、锁定屏幕 【免费下载链接】vorssaint-utils Free and open-source macOS menu bar toolkit. 项目地址: https://gitcode.com/GitHub_Trending/vo/vorssaint-utils Vorssaint 是一款免费开源的 macOS 菜单栏工具…

2026/10/25 23:28:57 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/9 14:01:10 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/9 14:56:39 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/10 2:03:25 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/9 14:01:10 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/9 7:45:06 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/9 14:01:11 阅读更多 →

日新闻

周新闻

月新闻