如何将JSON数组存储在Arduino程序中

How to store JSON Array in arduino program?

本文关键字:Arduino 程序 存储 数组 JSON      更新时间:2023-10-16

我正在研究IoT项目,我需要在Nodemcu中进行JSON解析。我在Arduinojson库的帮助下看到了Arduino的该示例代码,该示例代码效果很好,我能够成功地从URL(例如URL_1)中获取数据。现在,我想将此数据存储在数组中,以便从另一个UR2(例如URL_2)获取数据时,我可以将它们相互比较,并触发事件对结果的触发。url_1和url_2中的数据是形式的,
[" 1"," 1"," 1"," 1"," 0"," 0"," 0"," 0"]
并假设URL_1具有与指定相同的值。

我所做的是声明了一个数组数据[],其中我存储了解析的JSON值,以便以后可以在代码中的其他语句中使用它们。如您所见,我在URL中检索的数据只有1个和0,所以我想做的是"如果得到1做","否则执行此操作",您可以在代码中看到。但是问题是,一旦我结束了与URL的连接,数据[]数组仅给出垃圾值,我通过在串行监视器上打印它们,如代码所示。
我认为" const char* data [20]";存储JSON数据的位置,当我结束连接时,这些位置的数据也丢失了,这就是为什么我要获得垃圾值的原因。现在,我可能是错的,因为我是这些东西的新手。这就是为什么我想知道如何解决这个问题的原因,即如果我说正确的话,那么我该如何将解析的JSON数据存储在数组中,以免丢失,即使与URL的连接结束了。
(我是这个平台的新手,所以如果我做错了什么,希望你们可以为我的未来引导我,我也为我的英语破损道歉)。

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>  
const char* Data[20];
const char* ssid = "SSID";
const char* password = "Password";
//Connecting to WiFi
void setup() {
  WiFi.mode(WIFI_OFF);
  delay(1000);
  WiFi.mode(WIFI_STA);// Hides the viewing of ESP as wifi Hotspot 
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting...");
  }
  Serial.println("Connected to WiFi Successfully");
}
void loop()
{
  if(WiFi.status()== WL_CONNECTED)
  {
    HTTPClient http;
    //Starting connection  to url_1
    http.begin("url_1");
    int httpCode = http.GET();
    if(httpCode > 0)
    {
      String data = http.getString(); 
      const size_t bufferSize = JSON_ARRAY_SIZE(8) + 20;
      DynamicJsonBuffer jsonBuffer(bufferSize);
      JsonArray& root = jsonBuffer.parseArray(data);
      for(int i=0;i<8;i++){
        Data[i] = root[i];
        Serial.println("Printing whole Data");
        Serial.println(Data[i]);
      }
    }
    http.end();//ending the connetion

    for(int i=0;i<8;i++)
    {
      if(strcmp(Data[i],"1")==0){
        Serial.print("if satement, Data = ");
        Serial.println(Data[i]);  
      }
      else
      {
        Serial.print("else satement, Data = ");
        Serial.println(Data[i]);
      }
    }
  }
}

Data[]包含用于动态分配字符串的指针。当您使用JSON解析器离开代码块时,将调用其驱动器,因此分配的内存可以并且已被其他事物覆盖。

我建议使用

bool Data[...];
...
   // true for "1", false for "0"
   Data[i] = strcmp(root[i], "1") == 0;
...

编辑如果您需要存储更多"复杂"数据,例如实际字符串,您需要制作root[i]指向的字符串的副本。