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里面每一个元素都是一个键值对(由两个元素组成:键和值) 键必须是唯 ...
随机推荐
- 使用BigDecimal舍小数取整数
项目需求说明: 解决WMS系统收货容差问题,例如:SKU的采购数量95件,容差是5,95+95*5/100=99.75,传WMS的数量是99,且容差传零. 参数说明: 其中ROUND_UP:向上取整, ...
- AtCoder Beginner Contest 188 F - +1-1x2 思维题
题目描述 给你两个数 \(x\),\(y\) 可以对 \(x\) 进行 \(+1,-1\) 或 \(\times 2\) 的操作 问最少操作多少次后变为 \(y\) \(x,y \leq 10^{18 ...
- linux kernel操作GPIO函数
一.头文件 #include <asm/gpio.h> 二.注册 GPIO int gpio_request(unsigned gpio, const char *label) 功能:申请 ...
- Centos7 密钥对登陆(适用于群晖DSM)
www.swack.cn - 原文链接:Centos7 密钥对登陆(适用于群晖DSM) 1.生成证书 此处证书使用swack用户生成 注:不要使用root生成证书,因为我们后面会禁用root登陆 [s ...
- 计算机考研复试 A+B
题目描述 读入两个小于100的正整数A和B,计算A+B. 需要注意的是:A和B的每一位数字由对应的英文单词给出. 输入描述: 测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B ...
- python模块详解 | selenium(持续更新中)
目录: 关于selenium Selenium 安装Selenium 安装浏览器驱动 配置环境变量 selenium方法详解 定位元素 元素操作 浏览器操作 鼠标事件 浏览器事件 设置元素等待 多表单 ...
- 为啥使用innodb_flush_method=o_direct 就能减轻io压力呢
为啥使用innodb_flush_method=o_direct 就能减轻io压力呢
- 【Docker】/usr/bin/docker-current: Cannot connect to the Docker daemon at unix
------------------------------------------------------------------------------------------------- | ...
- kubernets之计算资源
一 为pod分配cpu,内存以及其他的资源 1.1 创建一个pod,同时为这个pod分配内存以及cpu的资源请求量 apiVersion: v1 kind: Pod metadata: name: ...
- 发票校验BAPI_INCOMINGINVOICE_CREATE
CALL FUNCTION 'BAPI_INCOMINGINVOICE_CREATE' EXPORTING headerdata = headerdata ...