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

时间:2022-02-21 09:58:02

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);
}
}