首页 > 解决方案 > 如何在 arduino 程序中存储 JSON 数组?

问题描述

我正在研究需要在 NodeMCU 中解析 JSON 的 IOT 项目。我在 ArduinoJson 库的帮助下看到了这个用于解析 JSON 的 arduino 示例代码,该库运行良好,我能够成功地获取和解析来自 url(比如 url_1)的数据。现在我想将这些数据存储在一个数组中,这样当我从另一个 ur2(比如 url_2)获取数据时,我可以将它们相互比较并触发与结果相关的事件。url_1 和 url_2 中的数据格式为
["1","1","1","1","0","0","0","0"]
并假设 url_1 具有与指定的。

我所做的是声明了一个数组 Data[],在其中存储了解析的 JSON 值,以便以后可以在代码中的 if else 语句中使用它们。如您所见,我在 url 中检索的数据只有 1 和 0,所以我想要做的是“如果得到 1 做这个”,“否则做那个”,你可以在代码中看到。但问题是,一旦我结束与 url 的连接,Data[] 数组只给出我通过在串行监视器上打印它们检查的垃圾值,如代码所示。
我相信“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]);
      }
    }
  }
}

标签: c++jsonarduinonodemcuarduino-esp8266

解决方案


Data[]包含指向动态分配的字符串的指针。当您使用 JSON 解析器保留代码块时,会调用其析构函数,因此分配的内存可以并且已经被其他内容覆盖。

我建议改用

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

编辑如果您需要存储更多“复杂”数据,例如实际字符串,您将需要复制指向的字符串root[i]


推荐阅读