首页 > 解决方案 > 从 API 请求数据

问题描述

这是串行监视器上的错误

我正在使用 ESP8266 NodeMcu,使用的 IDE 是 Arduino

我不知道该怎么办,现在已经10个小时了。

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>

//Provide your own WiFi credentials
const char* ssid = "Kyzer";
const char* password = "@kyzer4$";
//String for storing server response
String response = "";
//JSON document
DynamicJsonDocument doc(2048);


void setup() {
  Serial.begin(115200);
  //Initiate WiFi connection
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.print("WiFi connected with IP: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  //Initiate HTTP client
  HTTPClient http;
  //The API URL
  String request = "https://covid-api.mmediagroup.fr/v1/cases?country=Portugal";
  //Start the request
  http.begin(request);
  //Use HTTP GET request
  http.GET();
  //Response from server
  response = http.getString();
  //Parse JSON, read error if any
  DeserializationError error = deserializeJson(doc, response);
  if(error) {
     Serial.print(F("deserializeJson() failed: "));
     Serial.println(error.f_str());
     delay(5000);
     return;
  }
  //Print parsed value on Serial Monitor
  Serial.print("cases: ");
  Serial.println(doc["confirmed"].as<int>());
  Serial.print("recovered: ");
  Serial.println(doc["recovered"].as<int>());
  Serial.print("deaths: ");
  Serial.println(doc["deaths"].as<int>());
  Serial.println("");
  //Close connection  
  http.end();
  //Wait five seconds
  delay(5000);
}

请有人可以帮助我我无法获得我想要的数据并将其显示在串行监视器上,可能是什么问题?

标签: apihttpsarduinoesp8266nodemcu

解决方案


您尝试解析的 json 对象具有如下结构:

  {"All": {
    "confirmed": 378656, 
    "recovered": 304825, 
    "deaths": 6254, 
    "country": "Portugal", 
    "population": 10329506, 
    "sq_km_area": 91982, 
    "life_expectancy": "75.8", 
    "elevation_in_meters": 372, 
    "continent": "Europe", 
    "abbreviation": "PT", 
    "location": "Southern Europe", 
    "iso": 620, 
    "capital_city": "Lisboa", 
    "lat": "39.3999", 
    "long": "-8.2245", 
    "updated": "2020/12/22 23:22:35+00"
    }
  }

元素confirmed和都在元素下recovered,因此您需要通过评估来获取它,或者创建一个名为的新根 json 对象,以便您可以使用. 请参阅示例:deathsAllAlldoc["All"]["confirmed"]AllAll["confirmed"]

#include <ArduinoJson.h>

void setup() {
  Serial.begin(115200);
}

void loop() {

  const char* json = R"({"All": {
    "confirmed": 378656, 
    "recovered": 304825, 
    "deaths": 6254
    }
  }
  )";

  
  DynamicJsonDocument doc(512);
  DeserializationError error = deserializeJson(doc, json);
  if(error) {
     Serial.printf("deserializeJson() failed: %s\n", error.c_str());
     delay(5000);
     return;
  }
  //Get confirmed either via doc directly as:
  int confirmed = doc["All"]["confirmed"];
  // Or create a new json object the root object, and access children objects as:
  JsonObject All = doc["All"];
  int recovered = All["recovered"];
  int deaths = All["deaths"];
  Serial.printf("Confirmed: %d, Recovered: %d, Deaths: %d\n",confirmed, recovered, deaths);
  delay(5000);
}

推荐阅读