我正在研究需要在NodeMCU中进行JSON解析的IOT项目。
我在ArduinoJson库的帮助下看到了用于arduino解析JSON的示例代码,并且可以成功地从url(say 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]);
}
}
}
}
答案 0 :(得分:1)
Data[]
包含指向动态分配的字符串的指针。当您将代码块留给JSON解析器时,其析构函数将被调用,因此分配的内存可以并且已经被其他内容覆盖。
我建议改用
bool Data[...];
...
// true for "1", false for "0"
Data[i] = strcmp(root[i], "1") == 0;
...
编辑,如果您需要存储更多的“复杂”数据,例如实际的字符串,则需要复制root[i]
指向的字符串。