nlohmann::json 的 is_null() 用法解析:如何判断 JSON 值是否为 null

发布时间:2026/9/8 16:43:17

nlohmann::json 的 is_null() 用法解析:如何判断 JSON 值是否为 null
nlohmann::json 的 is_null() 用法解析如何判断 JSON 值是否为 null【免费下载链接】jsonJSON for Modern C项目地址: https://gitcode.com/GitHub_Trending/js/jsonis_null()是 JSON for Modern Cnlohmann::json提供的便捷类型检查成员函数之一用于判断当前 JSON 值是否恰好为null。它在解析可选字段、校验配置文件缺失项、以及遍历异构 JSON 容器等场景中高频使用。读完本文你将掌握is_null()的签名、返回值、异常保证与复杂度特性并通过源码与测试理解它与value_t类型系统、其他is_*()函数及is_primitive()/is_structured()分类函数之间的关系。函数签名与基本语义在nlohmann::json中is_null()的完整声明如下constexpr bool is_null() const noexcept;该函数在且仅在当前 JSON 值为#!json null时返回#!cpp true。它隶属于 basic_json 的“便捷类型检查器”convenience type checker一族同族还包括 is_boolean()、is_array()、is_object()、is_string()、is_number() 等。返回值当前值类型is_null()返回值#!json nulltrue其他任意类型boolean / number / object / array / string / binary 等false异常安全与复杂度异常安全noexcept保证No-throw guarantee该成员函数在任何情况下都不会抛出异常因此可以放心地用于不允许抛出异常的代码路径例如noexcept函数内部或析构函数中。复杂度常数时间Constant。整个调用只是一次类型标记的比较不涉及遍历、分配内存或解析等操作。从源码看实现原理is_null()的实现极简核心是对内部类型标记做一次相等比较。该实现位于 include/nlohmann/json.hpp#L1379-L1384/// brief return whether value is null /// sa https://json.nlohmann.me/api/basic_json/is_null/ constexpr bool is_null() const noexcept { return m_data.m_type value_t::null; }其中m_data.m_type是对象内部保存的“当前值类型”标记其取值来自枚举detail::value_t。该枚举在 include/nlohmann/detail/value_t.hpp#L53-L65 中定义覆盖了 JSON 的全部十种内部状态enum class value_t : std::uint8_t { null, /// null value object, /// object (unordered set of name/value pairs) array, /// array (ordered collection of values) string, /// string value boolean, /// boolean value number_integer, /// number value (signed integer) number_unsigned, /// number value (unsigned integer) number_float, /// number value (floating-point) binary, /// binary array (ordered collection of bytes) discarded /// discarded by the parser callback function };注意两个易混淆的边界情况value_t::discarded不等于value_t::null。discarded仅由解析回调parser callback在处理被丢弃的键/值时临时使用因此一个被标记为discarded的值is_null()也会返回false。nullptr字面量与 CNULL宏json(nullptr)构造出的值类型为value_t::null下文测试用例即用json const j(nullptr)构造空值但传入 C 风格空指针常量时必须写nullptr直接写整数0会被当作数字处理而不会得到null值。由于is_null()声明为constexpr在编译期可求值的上下文中例如静态断言或模板元编程同样可以使用。它在类型分类体系中的位置从 include/nlohmann/json.hpp 中相邻的实现可以看出is_null()不是孤立存在的它是整套类型分类体系的基础构件constexpr bool is_primitive() const noexcept { return is_null() || is_string() || is_boolean() || is_number() || is_binary(); } constexpr bool is_structured() const noexcept { return is_array() || is_object(); }也就是说is_primitive()判断是否为原始类型会把is_null()的结果作为其真值条件之一null与字符串、布尔、数字、二进制一起被归为“原始primitive”类型返回trueis_structured()判断是否为结构化类型与is_null()完全互补地覆盖数组与对象is_number()则由is_number_integer() || is_number_float()组合而成其中整数分支还要进一步区分number_integer与number_unsigned。相关实现可分别在 include/nlohmann/json.hpp#L1365-L1370is_primitive与 include/nlohmann/json.hpp#L1372-L1377is_structured中查看。完整示例对全部 JSON 类型逐一调用 is_null()仓库在 docs/mkdocs/docs/examples/is_null.cpp 中提供了一个覆盖所有 JSON 类型的完整示例。该示例创建了包括null、布尔、有符号/无符号整数、浮点数、对象、数组、字符串、二进制在内的九种值并逐一调用is_null()#include iostream #include nlohmann/json.hpp using json nlohmann::json; int main() { // create JSON values json j_null; json j_boolean true; json j_number_integer 17; json j_number_unsigned_integer 12345678987654321u; json j_number_float 23.42; json j_object {{one, 1}, {two, 2}}; json j_array {1, 2, 4, 8, 16}; json j_string Hello, world; json j_binary json::binary({1, 2, 3}); // call is_null() std::cout std::boolalpha; std::cout j_null.is_null() \n; std::cout j_boolean.is_null() \n; std::cout j_number_integer.is_null() \n; std::cout j_number_unsigned_integer.is_null() \n; std::cout j_number_float.is_null() \n; std::cout j_object.is_null() \n; std::cout j_array.is_null() \n; std::cout j_string.is_null() \n; std::cout j_binary.is_null() \n; }运行输出与 docs/mkdocs/docs/examples/is_null.output 一致true false false false false false false false false两个值得注意的细节默认构造json j_null;得到的正是null值这也是basic_json默认构造函数的语义因此它是示例中唯一返回true的对象代码在输出前启用了std::boolalpha让布尔结果以true/false而非1/0打印便于阅读。单元测试中的验证类型检查逻辑在测试套件 tests/src/unit-inspection.cpp 的convenience type checker一节中得到了系统验证。其测试手法是为每个 JSON 类型构造一个值然后用一组CHECK断言逐一确认所有is_*()函数的行为互斥且完备。以null小节为例tests/src/unit-inspection.cpp#L58-L74SECTION(null) { json const j(nullptr); CHECK(j.is_null()); CHECK(!j.is_boolean()); CHECK(!j.is_number()); CHECK(!j.is_number_integer()); CHECK(!j.is_number_unsigned()); CHECK(!j.is_number_float()); CHECK(!j.is_binary()); CHECK(!j.is_object()); CHECK(!j.is_array()); CHECK(!j.is_string()); CHECK(!j.is_discarded()); CHECK(j.is_primitive()); CHECK(!j.is_structured()); }这里用json const j(nullptr)显式构造空值随后验证is_null()为true、其余所有类型判定为false、同时is_primitive()为true而is_structured()为false。对象、数组、布尔等分节的测试如!j.is_null()则从反方向确认了该判定的排他性。这组测试既是is_null()行为的权威依据也可以作为读者在自己代码中安全组合各is_*()判定的参考模板。典型使用场景结合上述语义is_null()在真实项目中通常用于以下场合解析可选字段当 JSON 对象中某键可能缺失也可能显式为null时先用contains()或find()判断键是否存在再用at(key).is_null()区分“无此键”与“键值为 null”从而决定是否使用默认值遍历前的安全守卫对来自第三方接口的嵌套 JSON在向下取值前先用is_null()拦截空值避免对null继续调用getT()或下标访问而抛出类型转换/越界异常与type()配合的精确分支如果只需要“是否是 null”一个布尔结论直接使用is_null()即可若需要穷举所有类型做多路分发则可以基于 type() 返回的value_t编写switch语句。需要提醒的是is_null()只回答“当前值是不是null”这一事实问题并不会替你决定“null应该当作空值处理还是当作默认值处理”——这层业务逻辑需要调用方在is_null()返回true的分支中自行实现。版本历史自版本1.0.0起提供since version 1.0.0属于basic_json长久以来保持稳定的核心类型检查接口之一其底层实现所依赖的value_t枚举同样自 1.0.0 存在。小结is_null()是 nlohmann::json 中成本最低、最安全的类型检查接口常数时间复杂度、noexcept无异常保证、可constexpr求值。它的本质是对内部value_t类型标记的一次相等比较并与is_primitive()、is_structured()等高层分类函数协同工作。无论是解析可能缺失的 JSON 字段还是编写遍历异构数据的健壮代码将is_null()与其他is_*()函数配合使用都是判断 JSON 值类型最直接、最不易出错的方案。【免费下载链接】jsonJSON for Modern C项目地址: https://gitcode.com/GitHub_Trending/js/json创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

毕业党福音!不用逐字手动修改,几款宝藏降AIGC改写工具实测

毕业党福音!不用逐字手动修改,几款宝藏降AIGC改写工具实测

2026/9/8 16:43:17

优先选快降重(整篇处理、降幅最稳)、笔过AI(文风润色、改完像人写的)、快将AI(速度最快、单价最低),三款都是整篇上传自动处理,改动处标蓝方便核对,术语格式基本不丢不乱…

基于3D slicer 制作三维分割标签

基于3D slicer 制作三维分割标签

2026/9/8 16:43:17

打开数据 我的数据是从vtk内部保存出来的,格式为vtk 拆解组件体数据 由于我的数据是两组件,在3D Slicer中无法正常的显示,需要拆分 在检索按钮中,检索Vector to scalar volume 对index为0和1的组件进行拆解 然后进入volumes模式后,就可以正常展示切片了 裁剪立方体…

第26章 大畜•大蓄 积累的力量

第26章 大畜•大蓄 积累的力量

2026/9/8 16:43:17

冬天来了又走,树上的叶子落尽了又重新冒出来。当剑桥市的枫树再次爆出嫩绿的芽点时,悦儿决定开始写那本科普书。决定本身来得不算突然。她断断续续地想了一整个秋天和冬天,考虑过各种开头——从挂谷宗一在厕所里转刀的传说开始,从…

Remotion 图片处理完全指南:从 `<Img>` 布局定位到 `getImageDimensions` 动态取图

Remotion 图片处理完全指南:从 `<Img>` 布局定位到 `getImageDimensions` 动态取图

2026/9/8 19:23:24

Remotion 图片处理完全指南&#xff1a;从 <Img> 布局定位到 getImageDimensions 动态取图 【免费下载链接】remotion &#x1f3a5; Make videos programmatically with React 项目地址: https://gitcode.com/GitHub_Trending/re/remotion 本文围绕 Remotion 技能…

Clawdbot深度拆解:AI代理、爬虫机器人还是自动化智能体?

Clawdbot深度拆解:AI代理、爬虫机器人还是自动化智能体?

2026/9/8 19:23:24

最近后台好几个朋友留言&#xff0c;都在问同一个词&#xff1a;Clawdbot。说实话&#xff0c;我第一次拿到这个词的时候也愣了一下&#xff0c;因为市面上叫“XX bot”的产品太多了&#xff0c;有些是真有落地案例&#xff0c;有些还停在概念阶段。但把它当成一个商业和技术命…

Impeccable colorize 指南:在单色界面上建立有层次的战略性配色系统

Impeccable colorize 指南:在单色界面上建立有层次的战略性配色系统

2026/9/8 19:23:24

Impeccable colorize 指南&#xff1a;在单色界面上建立有层次的战略性配色系统 【免费下载链接】impeccable The design language that makes your AI harness better at design. 项目地址: https://gitcode.com/GitHub_Trending/im/impeccable 本文面向使用 Impeccabl…

SLAM只会建图不会认物?机器人语义导航全链路拆解

SLAM只会建图不会认物?机器人语义导航全链路拆解

2026/9/8 19:23:24

前阵子有朋友问我一个问题&#xff1a;SLAM建图画得挺漂亮&#xff0c;机器人也能在地图里绕开障碍物走来走去&#xff0c;但你跟它说“去找那把红色的椅子”&#xff0c;它为什么一脸茫然&#xff1f;这个问题的答案其实不复杂——SLAM建的是几何地图&#xff0c;地图里只有“…

基于GAN的图像修复实战:生成对抗网络原理与PyTorch实现

基于GAN的图像修复实战:生成对抗网络原理与PyTorch实现

2026/9/8 19:23:23

简介&#xff1a;基于Python编程语言实现深度生成对抗网络图像修复模型的完整工程项目&#xff0c;源码与项目文档齐备&#xff0c;主要面向毕业设计、课程设计与项目开发场景&#xff0c;也适合具备一定深度学习基础的学习者作为实践参考。压缩包共包含七个文件&#xff0c;其…

低成本具身RL实践:Apple Silicon上microduck-lab静态评测

低成本具身RL实践:Apple Silicon上microduck-lab静态评测

2026/9/8 19:13:23

1. 静态评测到底评什么&#xff1a;不跑硬件也能看清一个具身RL项目 这两年具身智能的热度不用我多说&#xff0c;但真正动手做过机器人强化学习的人心里都清楚&#xff0c;这个领域有个让新人非常头疼的现状——钱和门槛把一大批想干活的人拦在了外面。一套标准四足机器人真机…

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/7 20:21:46

本文首发于“生态学者”&#xff01;从“湿地面积”到“土壤碳密度”&#xff1a;为什么需要重新认识潮汐湿地蓝碳变化&#xff1f;潮汐湿地位于陆地与海洋的交汇地带&#xff0c;包括红树林、盐沼和潮滩&#xff0c;是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/8 4:55:53

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包&#xff0c;并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/7 8:03:37

大模型推理镜像极简瘦身&#xff1a;从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中&#xff0c;容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务&#xff0c;镜像体积通常被严格控制在 50MB 到 200MB 以内&#xff0c;拉取镜像只…

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

2026/9/8 0:02:30

芯片这个行业有个不太被人摆到台面上、但几乎每天都在发生的场景&#xff1a;客户拿着一条良率曲线截图问你&#xff0c;这批货的良率怎么掉了三个点&#xff0c;是不是工艺出问题了&#xff0c;产生的不良会不会流到他们产线上去。你解释了半天&#xff0c;客户似懂非懂&#…

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

2026/9/8 0:02:30

ValueError: sampler option is mutually exclusive with shuffle&#xff0c;这个报错我在 PyTorch 的 DataLoader 上至少见过几十次了&#xff0c;而且很有意思的是&#xff0c;它经常不是新手专属——很多写了好几年模型的老手&#xff0c;在从单机改成自定义采样器&#xf…

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

2026/9/8 0:02:30

有人可能在网上开着皮卡拍视频&#xff0c;声称中国电动车不仅性能不如美国大排量车型&#xff0c;安全性也堪忧。然而事实恰恰相反&#xff0c;GAC、吉利和零跑最新推出的电动车型在极为严苛的欧盟新车安全评鉴&#xff08;Euro NCAP&#xff09;测试中全部斩获满分。就在特斯…

远程协作的工作台整理

远程协作的工作台整理

2026/9/8 4:23:39

远程协作的工作台整理远程协作的核心不是再加一个工具&#xff0c;而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置&#xff1b;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/8 3:19:39

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/8 4:00:23

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…