如何在arduino程序中存储JSON数组?
How to store JSON Array in arduino program?
我正在从事 IOT 项目,我需要 JSON 在 NodeMCU 中进行解析。
我在 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,所以我想做的是 "If get 1 do this"、"else do that",您可以在代码中看到。但问题是,一旦我结束与 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]);
}
}
}
}
Data[]
包含指向动态分配的字符串的指针。当您使用 JSON 解析器离开代码块时,它的析构函数将被调用,因此分配的内存可以并且已经被其他东西覆盖。
我建议改用
bool Data[...];
...
// true for "1", false for "0"
Data[i] = strcmp(root[i], "1") == 0;
...
编辑 如果您需要存储更多 "complicated" 数据,例如实际字符串,您需要复制 root[i]
.
指向的字符串
我正在从事 IOT 项目,我需要 JSON 在 NodeMCU 中进行解析。
我在 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,所以我想做的是 "If get 1 do this"、"else do that",您可以在代码中看到。但问题是,一旦我结束与 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]);
}
}
}
}
Data[]
包含指向动态分配的字符串的指针。当您使用 JSON 解析器离开代码块时,它的析构函数将被调用,因此分配的内存可以并且已经被其他东西覆盖。
我建议改用
bool Data[...];
...
// true for "1", false for "0"
Data[i] = strcmp(root[i], "1") == 0;
...
编辑 如果您需要存储更多 "complicated" 数据,例如实际字符串,您需要复制 root[i]
.