api - 从 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);
}
请有人可以帮助我我无法获得我想要的数据并将其显示在串行监视器上,可能是什么问题?
解决方案
您尝试解析的 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 对象,以便您可以使用. 请参阅示例:deaths
All
All
doc["All"]["confirmed"]
All
All["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);
}
推荐阅读
- expect - 尝试使用 Expect 从多个 telnet spawn 接收长登录序列
- reactjs - .map() 在 React 中的谷歌地图标记上
- java - 如何在 CXF Out Fault Interceptor 中将 HTTP STATUS 代码设置为 500 以外的值?
- azure - 将 Azure 监视器容器添加到仪表板
- reactjs - 在 JSX 循环中向函数传输数据:作用域函数与数据属性
- angular - 使用快速服务器和 passport.js 进行 Angular SPA 身份验证 -> 路由问题
- ruby-on-rails - Rails Form_with 显示内联错误信息
- javascript - 我使用 .catch 来捕获对承诺的拒绝,但它说我使用 .catch
- c# - DateTime 仅在 Internet Explorer 上解析确切错误
- javascript - 缩小时如何在高图中对数据进行分组