формат json в esp32 с arduino json

Я использую модуль ESP32 для подключения по Bluetooth и сканирования сети Wi-Fi. Но я не могу отформатировать json с помощью библиотеки arduinojson так, как хочу.

void scanWifiNetworks() {
  //creating json
  DynamicJsonDocument jsonDoc(1024);
  char jsonBuffer[512];
  JsonObject wifiJsonObject = jsonDoc.createNestedObject("wifiList");
  wifiJsonObject["ssid"];
  Serial.println("scan start");

  // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
  Serial.println("scan done");
  if (n == 0) {
    Serial.println("no networks found");
  } else {
    Serial.print(n);
    Serial.println(" networks found");
    for (int i = 0; i < n; ++i) {
      // Print SSID and RSSI for each network found
//      Serial.print(i + 1);
//      Serial.print(": ");
//      Serial.print(WiFi.SSID(i));
//      Serial.print(" (");
//      Serial.print(WiFi.RSSI(i));
//      Serial.print(")");
//      Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*");

      wifiJsonObject["ssid"] = WiFi.SSID(i);
      serializeJsonPretty(jsonDoc, SerialBT);
      serializeJsonPretty(jsonDoc, Serial);
      delay(10);
    }
  }
  Serial.println("");

  // Wait a bit before scanning again
  delay(60000);
}

Выход такой

scan start
scan done
5 networks found
{
  "wifiList": {
    "ssid": "quark"
  }
}{
  "wifiList": {
    "ssid": "Airtel_Zerotouch"
  }
}{
  "wifiList": {
    "ssid": "NETGEAR77"
  }
}{
  "wifiList": {
    "ssid": "Itobuz-technologies"
  }
}{
  "wifiList": {
    "ssid": "Nokia 6.1"
  }
}

я хочу что-то в этом роде

{ "список вайфай": { "ssid1": "кварк1", "ssid2": "кварк2" }

Я знаю, что неправильно зацикливаюсь, но не могу понять. если возможно, укажите правильное направление, это очень поможет.

, 👍1

Обсуждение

массив ящиков, а не объект. создатьNestedArray("wifiList"), @Juraj


1 ответ


2

Вы постоянно перезаписываете свойство ssid одного и того же объекта. Вместо этого вы хотите написать разные свойства, например

wifiJsonObject["ssid" + String(i+1)] = WiFi.SSID(i);

Затем сериализуйте документ только один раз, когда он будет готов.

При этом я полностью согласен с Юраем в том, что правильный способ представлять список в формате JSON (и wifiList явно предназначен для списка) с помощью массива:

void scanWifiNetworks() {
    DynamicJsonDocument jsonDoc(1024);
    JsonArray wifiList = jsonDoc.createNestedArray("wifiList");
    int n = WiFi.scanNetworks();
    for (int i = 0; i < n; ++i) {
        JsonObject wifiNet = wifiList.createNestedObject();
        wifiNet["ssid"] = WiFi.SSID(i);
    }
    serializeJsonPretty(jsonDoc, SerialBT);
    serializeJsonPretty(jsonDoc, Serial);
}

Это должно создать документ JSON, который выглядит следующим образом:

{
"список вайфай": [
{ "ssid": "кварк" },
{ "ssid": "Airtel_Zerotouch" },
{ "ssid": "NETGEAR77" },
{ "ssid": "Итобуз-технологии" },
{ "ssid": "Нокиа 6.1" }
]
}

Обновление: обратите внимание, что если это ясно из контекста (например, URL-адрес запроса) что вы передаете список сетей WiFi, то вы можете избавиться внешнего объекта и метки "wifiList" и использовать массив в качестве Документ JSON:

[
{ "ssid": "кварк" },
{ "ssid": "Airtel_Zerotouch" },
{ "ssid": "NETGEAR77" },
{ "ssid": "Итобуз-технологии" },
{ "ssid": "Нокиа 6.1" }
]

Как предложил Яроманда X, если вы никогда не собираетесь расширять внутреннюю объекты с дополнительной информацией, вы можете еще больше упростить документ, удаление этих объектов и просто перечисление SSID в массиве:

[
"кварк",
"Эртел_Зеротач",
"NETGEAR77",
«Итобуз-технологии»,
"Нокиа 6.1"
]
,

Спасибо. Концепция массива была мне непонятна., @sdebarun

поскольку все объекты в массиве являются *ssid* - вы можете еще больше упростить (и уменьшить) вывод, изменив wifiList на массив только строк ssid, @Jaromanda X

@JaromandaX: Действительно - отредактировал ответ. Сначала я предположил, что ОП может позже добавить к записям другие свойства (мощность сигнала, канал...)., @Edgar Bonet