NodeMCU使用ArduinoJson判断指定键值对存在与否
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())
因此,可以理解为当其取值为空时则返回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判断指定键值对存在与否的更多相关文章
- php中判断数组键值,array_key_exists和isset区别
$arr = array('key' => NULL); if(isset($arr['key'])){ echo 'isset'; } else { echo 'unset'; } echo ...
- JavaScript获取Django模板中指定键值的数据,使用过滤器
Django中利用js来操作数据的常规操作一般为点(.)操作符来获取字典或列表的数据,一般如{{data.0}},{{data.arg}} 但有时如果数据是嵌套类型的数据时,直接获取某个值就变得困难了 ...
- C# Aspose word 替换指定键值数据
今天研究一天的导出word,一开始准备选用为软件自带的office,但是有局限性,机子上必须安装office才能使用,最后在网上搜了一下资料aspose开源的 小公司没得钱,你懂得.最后选择了这款 开 ...
- php对数组中指定键值排序
function array_sort($arr,$keys,$type='asc'){ $keysvalue = $new_array = array(); foreach ($arr as $k= ...
- PHP 二维数组排序 可以按指定 键值排序
<?php header("Content-Type:utf-8"); $arr = array( 0 => array( 'name' => '国际原油价格', ...
- windows Driver 查询指定键值
NTSTATUS status; HANDLE hKey = NULL; OBJECT_ATTRIBUTES oa; UNICODE_STRING strPath = RTL_CONSTANT_STR ...
- 从源码看HashMap键值对集合
之前我们看过了两种类型的集合,ArrayList集合和LinkedList集合,两种集合各有优势,我们不具体说了,但是本篇要看的集合可以完成它们完成不了的任务.比如:现有一篇文章,要你统计其中出现了哪 ...
- Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)
本章对Redis服务器的数据库实现进行介绍,说明Redis数据库相关操作的实现,包括数据库中键值对的添加.删除.查看.更新等操作的实现:客户端切换数据库的实现:键超时相关功能的实现.键空间事件通知等. ...
- 使用Dictionary键值对判断字符串中字符出现次数
介绍Dictionary 使用前需引入命名空间 using System.Collections.Generic Dictionary里面每一个元素都是一个键值对(由两个元素组成:键和值) 键必须是唯 ...
随机推荐
- ARM杂散知识
画重点: 1.存储器格式:重点是大小端识别 经常考 2.对齐后结构体占用空间大小:使用aligned,packed,#pragma pack()三种方式都要会 Thumb指令集 Thumb指令集能够以 ...
- Java基础--接口回调(接口 对象名 = new 类名)理解
接口 对象名1 = new 类名和类名 对象名2 = new 类名的区别是什么? 实例 /** *Person.java 接口 */ public interface Person { void in ...
- 在Termux(非root的安卓Linux模拟器)中安装和使用ftp服务器(pure-ftpd)(原创)[简单极致]
Termux是单用户的linux模拟器,所以应用的专属文件夹下面.usr/etc/下面没有passwd和group文件对多用户组配置,只在.usr/bin/下面有passwd二进制应用可以改变当前用户 ...
- VRP OS Management
From WizNote
- 【对线面试官】Java 反射&&动态代理
// 抽象类,定义泛型<T> public abstract class BaseDao<T> { public BaseDao(){ Class clazz = this.g ...
- Python requirements.txt 语法
前言 之前一直苦于一个问题,比如一些包在Win上安装不了,比如 uvloop 但是为了提高效率,代码中必须有这个模块 在运行中可以通过 os 模块判断是否使用, 那依赖文件呢? requirement ...
- Vue.nextTick()的使用
什么是Vue.nextTick()?? 定义:在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 所以就衍生出了这个获取更新后的DOM的Vue方法.所 ...
- LeetCode53 最大子序列问题
题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], ...
- 【EXP】导出数据库dmp文件,只有几张表有数据,剩下的所有表只有表结构没有数据
导出一个dmp,指定的表中有数据,其他的表只有表结构, 有数据的表只有几张,分别是A,B,C三张表,剩下的表都没有数据 思路: 导出一个111.dmp,所有的表都只是表结构 将111.dmp导入到新创 ...
- CTF------pwn笔记
地址:http://pwnable.kr/play.php 题目: 使用MobaXterm连接(当然也可以使用别的软件进行连接,用的顺手就行) 连接成功后所以"ls"命令查看目录 ...