NodeMCU使用ArduinoJson判断指定键值对存在与否

从ArduinoJson库中可以得知,判断键值对是否存在可以使用containskey()函数,但是查看ArduinoJson-containskey函数说明后得知该函数只能读取并第一层的键值对.因此不建议用该containsKey()函数

那么如何判断任意键值对是否存在呢,

通过测试,当取指定键值数据时,若该键不存在,则返回为空,倘若赋值为字符串String的话则为null,基于这个特性,便可以将其赋值为const char*或者是String,具体内容参考以下示例程序:

示例程序

可以通过此示例程序得知判断JSON信息是否存在指定键值对

#include <ArduinoJson.h>

void setup() {
Serial.begin(9600);
Serial.println("\n\n"); const size_t capacity = JSON_OBJECT_SIZE(1) + 3 * JSON_OBJECT_SIZE(3) + 120;
DynamicJsonDocument doc(capacity); const char* json = "{\"info\":{\"name\":\"taichimaker\",\"url\":\"www.taichi-maker.com\",\"email\":\"taichimaker@163.com\"},\"digital_pin\":{\"d1\":1,\"d2\":0,\"d3\":1},\"analog_pin\":{\"a0\":500}}"; deserializeJson(doc, json); // 方法一:使用String变量进行读取 (取消注释即可)
String m_info_find = doc["info"];
if (m_info_find != "null") { // 方法二:参考https://arduinojson.org/v6/api/jsondocument/containskey/
// 底部给出的例子,读取其中info键中的指定键值对,以"name"为例,进行判断
// const char* m_info_find = doc["info"]["name"];
// if (m_info_find ) { JsonObject info = doc["info"];
const char* info_name = info["name"]; // "taichimaker"
const char* info_url = info["url"]; // "www.taichi-maker.com"
const char* info_email = info["email"]; // "taichimaker@163.com" JsonObject digital_pin = doc["digital_pin"];
int digital_pin_d1 = digital_pin["d1"]; // 1
int digital_pin_d2 = digital_pin["d2"]; // 0
int digital_pin_d3 = digital_pin["d3"]; // 1 int analog_pin_a0 = doc["analog_pin"]["a0"]; // 500 Serial.print("nameStr = "); Serial.println(info_name);
Serial.print("websiteStr = "); Serial.println(info_url);
}
else {
Serial.print("数据中未包含指定信息\n\n ");
Serial.print(m_info_find);
} } void loop() {}

适用对象

事实上这种直接取键名并进行判断的方法适用于ArduinoJSON里的各种对象,具体说明可参考一下链接,

并可从以下链接页面得知可以使用if(object)代替object.isNull())

JsonDocument::isNull()

JsonVariant::isNull()

JsonObjectConst::isNull()

JsonVariantConst::isNull()

JsonArray::isNull()

因此,可以理解为当其取值为空时则返回null ,取值不为空时指向内容;

测试程序

可以通过此测试程序判断出此方法适用于JsonArray,JsonObject,JsonVariant

#include <ArduinoJson.h>

void setup() {
Serial.begin(9600);
Serial.println("\n\n"); JsonArray_test();
JsonObject_test();
JsonVariant_test(); } void loop() {} void JsonArray_test() {
const size_t capacity = JSON_ARRAY_SIZE(2) + 40;
DynamicJsonDocument doc(capacity);
const char* json = "[\"TaichiMaker\",\"www.taichi - maker.com\"]";
deserializeJson(doc, json);
/*
const char* root_0 = doc[0]; // "TaichiMaker"
const char* root_1 = doc[1]; // "www.taichi - maker.com"
*/
JsonArray array = doc.as<JsonArray>();
const char* m_info_find = array[0];
if (m_info_find) {
Serial.print("JsonArray 解析成功 "); Serial.println(m_info_find);
} else {
Serial.print("JsonArray 解析失败 "); Serial.println(m_info_find);
}
} void JsonObject_test() {
const size_t capacity = JSON_OBJECT_SIZE(1) + 3 * JSON_OBJECT_SIZE(3) + 120;
DynamicJsonDocument doc(capacity);
const char* json = "{\"info\":{\"name\":\"taichimaker\",\"url\":\"www.taichi-maker.com\",\"email\":\"taichimaker@163.com\"},\"digital_pin\":{\"d1\":1,\"d2\":0,\"d3\":1},\"analog_pin\":{\"a0\":500}}"; deserializeJson(doc, json);
JsonObject info = doc["info"];
/*
const char* info_name = info["name"]; // "taichimaker"
const char* info_url = info["url"]; // "www.taichi-maker.com"
const char* info_email = info["email"]; // "taichimaker@163.com"
*/
const char* m_info_find = info["name"];
if (m_info_find) {
Serial.print("JsonObject 解析成功 "); Serial.println(m_info_find);
} else {
Serial.print("JsonObject 解析失败 "); Serial.println(m_info_find);
}
} void JsonVariant_test() { const size_t capacity = JSON_OBJECT_SIZE(1) + 3 * JSON_OBJECT_SIZE(3) + 120;
DynamicJsonDocument doc(capacity);
const char* json = "{\"info\":{\"name\":\"taichimaker\",\"url\":\"www.taichi-maker.com\",\"email\":\"taichimaker@163.com\"},\"digital_pin\":{\"d1\":1,\"d2\":0,\"d3\":1},\"analog_pin\":{\"a0\":500}}"; deserializeJson(doc, json);
JsonVariant info = doc["info"];
/*
const char* info_name = info["name"]; // "taichimaker"
const char* info_url = info["url"]; // "www.taichi-maker.com"
const char* info_email = info["email"]; // "taichimaker@163.com"
*/
const char* m_info_find = info["name"];
if (m_info_find) {
Serial.print("JsonVariant 解析成功 "); Serial.println(m_info_find);
} else {
Serial.print("JsonVariant 解析失败 "); Serial.println(m_info_find);
}
}

NodeMCU使用ArduinoJson判断指定键值对存在与否的更多相关文章

  1. php中判断数组键值,array_key_exists和isset区别

    $arr = array('key' => NULL); if(isset($arr['key'])){ echo 'isset'; } else { echo 'unset'; } echo ...

  2. JavaScript获取Django模板中指定键值的数据,使用过滤器

    Django中利用js来操作数据的常规操作一般为点(.)操作符来获取字典或列表的数据,一般如{{data.0}},{{data.arg}} 但有时如果数据是嵌套类型的数据时,直接获取某个值就变得困难了 ...

  3. C# Aspose word 替换指定键值数据

    今天研究一天的导出word,一开始准备选用为软件自带的office,但是有局限性,机子上必须安装office才能使用,最后在网上搜了一下资料aspose开源的 小公司没得钱,你懂得.最后选择了这款 开 ...

  4. php对数组中指定键值排序

    function array_sort($arr,$keys,$type='asc'){ $keysvalue = $new_array = array(); foreach ($arr as $k= ...

  5. PHP 二维数组排序 可以按指定 键值排序

    <?php header("Content-Type:utf-8"); $arr = array( 0 => array( 'name' => '国际原油价格', ...

  6. windows Driver 查询指定键值

    NTSTATUS status; HANDLE hKey = NULL; OBJECT_ATTRIBUTES oa; UNICODE_STRING strPath = RTL_CONSTANT_STR ...

  7. 从源码看HashMap键值对集合

    之前我们看过了两种类型的集合,ArrayList集合和LinkedList集合,两种集合各有优势,我们不具体说了,但是本篇要看的集合可以完成它们完成不了的任务.比如:现有一篇文章,要你统计其中出现了哪 ...

  8. Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)

    本章对Redis服务器的数据库实现进行介绍,说明Redis数据库相关操作的实现,包括数据库中键值对的添加.删除.查看.更新等操作的实现:客户端切换数据库的实现:键超时相关功能的实现.键空间事件通知等. ...

  9. 使用Dictionary键值对判断字符串中字符出现次数

    介绍Dictionary 使用前需引入命名空间 using System.Collections.Generic Dictionary里面每一个元素都是一个键值对(由两个元素组成:键和值) 键必须是唯 ...

随机推荐

  1. ForwardProcess

    共享式网络中,发送的报文所有设备都可以收到 0.0.0.0/0 缺省路由 可以到达任意网络 From WizNote

  2. LeetCode701 二叉搜索树中插入结点

    给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树. 返回插入后二叉搜索树的根节点. 保证原始二叉搜索树中不存在新值. 注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜 ...

  3. 【Flutter】功能型组件之数据共享

    前言   InheritedWidget提供了一种数据在widget树中从上到下传递.共享的方式,例如在应用的根widget中通过InheritedWidget共享了一个数据,那么便可以在子widge ...

  4. 天梯赛练习 L3-006 迎风一刀斩 (30分) 几何关系

    题目分析: 对于给出的两个多边形是否可以组成一个矩形,这里我们分以下几种情况讨论 1.首先对于给出的两个多边形只有3-3,3-4,3-5,4-4才有可能组成一个矩形,并且两个多边形只可能是旋转90,1 ...

  5. python列表字符串集合常用方法

    1.1 列表常用方法 # 1. append 用于在列表末尾追加新的对象a = [1,2,3]a.append(4) # the result : [1,2,3,4]​# 2. count方法统计某个 ...

  6. 【Linux】Linux下如何分区及如何格式化

    环境:CentOS7.1 磁盘大小是1.8T 将磁盘/dev/sda分一个分区,分区类型为xfs fdisk /dev/sda n    --创建新分区 p  --创建分区类型为主分区 1  --主分 ...

  7. leetcode刷题录-1395

    目录 题目 思考过程 查看别人分享的思路 总结 题目 题目地址:https://leetcode-cn.com/problems/count-number-of-teams/ n 名士兵站成一排.每个 ...

  8. playwright自动化项目搭建

    这是关于playwright系列介绍的最后一篇.搭建基于 playwright 的自动化项目. GitHub地址: https://github.com/defnngj/playwright-pro ...

  9. 3A的限流芯片PW1503

    PW1503是超低RDS(ON)开关,具有可编程的电流限制,以保护电源于过电流和短路情况.它具有超温保护以及反向闭锁功能. PW1503采用薄型(1毫米)5针薄型SOT封装,提供可调版本. 特征    ...

  10. ReactRouter的实现

    ReactRouter的实现 ReactRouter是React的核心组件,主要是作为React的路由管理器,保持UI与URL同步,其拥有简单的API与强大的功能例如代码缓冲加载.动态路由匹配.以及建 ...