zoukankan      html  css  js  c++  java
  • 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())

    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);
      }
    }
    
    
  • 相关阅读:
    httpclient用法
    JS逻辑运算符&&与||的妙用
    jackson详解
    MVC +EF+linq 多表联查
    Log4net 集成到MVC+EF框架
    Asp.net中的页面跳转及post数据
    字符串的分割操作
    线程的信号机制
    事件的标准模式
    Java网络编程
  • 原文地址:https://www.cnblogs.com/dapenson/p/12822479.html
Copyright © 2011-2022 走看看