NodeMCU使用ArduinoJson判断指定键值对存在与否
阅读原文时间:2023年07月11日阅读:1

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