Проблема с анализом API оповещений о суровых погодных условиях NWS с помощью Arduino_JSON.h

esp32 json

Я уже некоторое время пользуюсь 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.

, 👍0

Обсуждение

Можете ли вы описать эти «странные данные»? Можете ли вы показать нам остальную часть кода?, @VE7JRO

пожалуйста, не заключайте URL-адрес в кавычки при публикации здесь, @jsotola

Я не получаю никакой распечатанной информации ... это не имеет смысла ... у вас есть несколько строк, которые печатают фиксированный текст ... они должны печататься, @jsotola

пожалуйста, опубликуйте код, который действительно компилируется, @jsotola

откуда берется ["features"]["severity"] в JSON-файле?, @jsotola

вы также можете просто разбить ответ на строки по ключам без JSON-преобразования, что хорошо для больших ответов. например: strstr(resp, "\"description\":"), @dandavis


1 ответ


Лучший ответ:

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