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. js 的关键字

    1.get / set var test = { _Name: "Limei", _Age: 20, get name() { return this._Name;}, set a ...

  2. idea中maven的安装与配置

    说明:类似maven安装和配置的帖子在网上有很多,本人也有做过参照,但是有些帖子的步骤跳跃性比较大,故此,本人整理了一下,给大家做个参考. 一.下载安装 一般都是在官网进行下载 https://mav ...

  3. .NET 云原生架构师训练营(模块二 基础巩固 RabbitMQ HelloWorld)--学习笔记

    2.6.3 RabbitMQ -- HelloWorld 发送端 接收端 rabbitmq container 发送信息 https://www.rabbitmq.com/tutorials/tuto ...

  4. TensorFlow中数据读取—如何载入样本

    考虑到要是自己去做一个项目,那么第一步是如何把数据导入到代码中,何种形式呢?是否需要做预处理?官网中给的实例mnist,数据导入都是写好的模块,那么自己的数据呢? 一.从文件中读取数据(CSV文件.二 ...

  5. label_form

    表单: action "URL" 如果为空,则本form接收 指定接收方 disabled 指定该标签是否可用 method "net" "http& ...

  6. springboot集成轻量级权限认证框架sa-token

    sa-token是什么? sa-token是一个JavaWeb轻量级权限认证框架,主要解决项目中登录认证.权限认证.Session会话等一系列由此衍生的权限相关业务.相比于其他安全性框架较容易上手. ...

  7. python学习笔记 | 猜拳游戏

    ''' @author: 人人都爱小雀斑 @time: 2020/3/6 18:52 @desc: 实验结果心得: 1.难点主要在判断谁输谁赢 2.挺好的 ''' import random d={1 ...

  8. 关于maven多module的依赖问题

    之前的项目因为历史的原因,都是一个project里只包含了一个module,今年进入了新的项目组,出现了多个module,最近刚好也是在学<maven实战>因此想要将这个东西记录下来 工程 ...

  9. 最新详解android自动化无障碍服务accessibilityservice以及高版本问题_1_如何开启获得无障碍

    前言 无障碍服务accessibilityservice是什么 简单来说 无障碍服务就是一个为残障人士 尤其是视觉障碍人士提供的一个帮助服务.具体就是可以识别控件 文字 可以配合语音助手 操作和 使用 ...

  10. LeetCode1022. 从根到叶的二进制数之和

    题目 class Solution { public: int ans = 0; int sumRootToLeaf(TreeNode* root) { dfs(root,0); return ans ...