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);
      }
    }
    
    
  • 相关阅读:
    LeetCode 769. Max Chunks To Make Sorted
    LeetCode 845. Longest Mountain in Array
    LeetCode 1059. All Paths from Source Lead to Destination
    1129. Shortest Path with Alternating Colors
    LeetCode 785. Is Graph Bipartite?
    LeetCode 802. Find Eventual Safe States
    LeetCode 1043. Partition Array for Maximum Sum
    LeetCode 841. Keys and Rooms
    LeetCode 1061. Lexicographically Smallest Equivalent String
    LeetCode 1102. Path With Maximum Minimum Value
  • 原文地址:https://www.cnblogs.com/dapenson/p/12822479.html
Copyright © 2011-2022 走看看