Проблема с анализом API оповещений о суровых погодных условиях NWS с помощью Arduino_JSON.h
Я уже некоторое время пользуюсь API Open Weather и Weather Undground. Недавно узнал, что у Национальной метеорологической службы есть API для оповещений. Я могу распечатать необработанные данные, но не могу их анализировать. Формат JSON, похоже, немного отличается от того, к которому я привык.
Это ссылка на информацию, которую я хочу проанализировать: https://api.weather.gov/alerts/active?zone=OHC093
Используя Arduino_JSON.h, я выполнил следующий тестовый код, чтобы проверить, смогу ли получить необходимую мне информацию.
void ParseWeatherAlerts() {
Serial.println("\t**** Parse Weather Alerts *****");
JSONVar myObject = JSON.parse(NWS_Current_Severe_Weather_Alerts);
// JSON.typeof(jsonVar) можно использовать для получения типа переменной
if (JSON.typeof(myObject) == "undefined") {
if (flgDebug) {
Serial.println("\n\tParsing input failed!");
}
return;
}
String severity = myObject["features"]["severity"];
String event = myObject["features"]["event"];
Serial.print("\tSeverity = ");
Serial.println(severity);
Serial.print("\tAlert Event = ");
Serial.println(event);
}
Никакой информации не выводится. Работаю над этим уже несколько часов. API, похоже, выдаёт какие-то странные данные, и я не могу определить КЛЮЧИ для jSON.
@DAVID T., 👍0
Обсуждение1 ответ
Лучший ответ:
Строка серьезность = myObject["features"]["severity"];
Если вы запустите команду curl cli на своем ПК по URL-адресу https://api.weather.gov/alerts/active?zone=OHC093, она вернет объект JSON, как показано ниже (часть элементов удалена, чтобы подчеркнуть только структуру):
{
// ...
"features": [
{
// ...
"properties": {
// ...
"severity": "Severe",
// ...
"event": "Flood Warning"
// ...
},
},
],
// ...
}
Обратите внимание, что features — это элемент массива, поэтому для доступа к нему нужно использовать myObject["features"][0]. Элемент "severity" является элементом "properties". Поэтому правильный код должен быть таким:
JsonDocument doc;
DeserializationError error = deserializeJson(doc, input);
JsonObject myObject = doc["features"][0];
JsonObject propertyObj = myObject["properties"];
const char* severity = propertyObj["severity"];
const char* event = propertyObj["event"];
Кстати, библиотека ArduinoJson предлагает онлайн-инструмент ArduinoJson Assistant, который поможет вам сериализовать и десериализовать объект JSON.
Обратите внимание, что у вас может быть больше одной функции (я проверил URL и получил две), а в очень ясную погоду функций может и не быть вовсе., @Edgar Bonet
- Публиковать данные json в mqtt
- Ошибка Guru Meditation: Core 1 panic'ed (Interrupt wdt timeout on CPU1)
- Arduino создает массив Json с двойными значениями и 2 десятичными знаками
- Использование ESPAsyncWebServer.h с ArduinoJson версии 6 для транзакций мастер-клиент
- формат json в esp32 с arduino json
- Не могу скомпилировать .ino с помощью библиотеки ArduinoJson
- WiFi.begin не работает с выводом const char* ArduinoJson
- Не могу прочитать данные json esp 32 ошибка «parseObject() failed»
Можете ли вы описать эти «странные данные»? Можете ли вы показать нам остальную часть кода?, @VE7JRO
пожалуйста, не заключайте URL-адрес в кавычки при публикации здесь, @jsotola
Я не получаю никакой распечатанной информации... это не имеет смысла ... у вас есть несколько строк, которые печатают фиксированный текст ... они должны печататься, @jsotolaпожалуйста, опубликуйте код, который действительно компилируется, @jsotola
откуда берется
["features"]["severity"]в JSON-файле?, @jsotolaвы также можете просто разбить ответ на строки по ключам без JSON-преобразования, что хорошо для больших ответов. например:
strstr(resp, "\"description\":"), @dandavis