ArduinoJson, Probleme mit Filter und statischem Dokument

Hallo,

ich bekomme bei jeder deserialisation außer mit DynamicJsonDocument diese Fehlermeldung:

D:\arduino_unterlagen\sketchbook\sketch_feb03a\sketch_feb03a.ino: In function 'void wetterdaten_auswerten(const String&)':
sketch_feb03a:91:14: error: 'ArduinoJson::V6213PB2::JsonDocument::JsonDocument()' is protected within this context
JsonDocument filter;
^~~~~~
In file included from D:\arduino_unterlagen\sketchbook\libraries\ArduinoJson\src/ArduinoJson/Document/BasicJsonDocument.hpp:7,
from D:\arduino_unterlagen\sketchbook\libraries\ArduinoJson\src/ArduinoJson/Document/DynamicJsonDocument.hpp:7,
from D:\arduino_unterlagen\sketchbook\libraries\ArduinoJson\src/ArduinoJson.hpp:33,
from D:\arduino_unterlagen\sketchbook\libraries\ArduinoJson\src/ArduinoJson.h:9,
from D:\arduino_unterlagen\sketchbook\sketch_feb03a\sketch_feb03a.ino:3:
D:\arduino_unterlagen\sketchbook\libraries\ArduinoJson\src/ArduinoJson/Document/JsonDocument.hpp:280:3: note: declared protected here
JsonDocument() : pool_(0, 0) {}
^~~~~~~~~~~~
sketch_feb03a:91:14: error: 'ArduinoJson::V6213PB2::JsonDocument::~JsonDocument()' is protected within this context
JsonDocument filter;
^~~~~~

usw. ....

Aufbauend auf einem Beispiel, in dem eben DynamicJsonDocument verwendet wurde, habe ich in Wokwi einen Sketch gebaut, der die Zuordnung der API-Daten entsprechend vornimmt.
Läuft und die Daten stimmen.
Anschließend habe ich noch entsprechende Filter angelegt, läuft auch, egal in welcher Kombination von Dokumentenart und Filter.

Auf dem Rechner jedoch bricht alles außer rein DynamicJsonDocument wetter(1000) mit einer Fehlermeldung ab.
Ich habe den Code, den die Website (ArduinoJson Assistant 7 | ArduinoJson 7) generiert versucht, ebenfalls Abbruch.

Hier der Code, der zumindest hier läuft.

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>


// Wetterdaten ----------------------------------------------------
long sonnenaufgang[2];
long sonnenuntergang[2];

int wettersymbol[5];
float temp[5];
float windgeschwindigkeit[5];
float luftfeuchte[5];
float niederschlag[5];

//WiFi
const char* wifi_ssid = "Wokwi-GUEST"; // SSID
const char* wifi_password = ""; // Password

WiFiClient wifiClient;


void setup() {

// Serielle Schnittstelle initialisieren
Serial.begin(115200);

// -> WLAN-Verbindung aufbauen
wifiConnect();

} // Ende setup

// -------------------------------------------------------------------------------

void loop() {

// WLAN-Verbindung prüfen
if (WiFi.status() != WL_CONNECTED) {
WiFi.disconnect();
wifiConnect();
}

String wetterdaten = wetterdaten_holen();

wetterdaten_auswerten(wetterdaten);


Serial.println("Ende loop -------------------");

delay(5000);

} // Ende loop

// -------------------------------------------------------------------------------

String wetterdaten_holen() {

String wetterdaten = "";

HTTPClient http;
  String apiUrl = "http://api.open-meteo.com/v1/dwd-icon?latitude=50.9042&longitude=12.08&hourly=temperature_2m,relative_humidity_2m,precipitation,weather_code,wind_speed_10m&daily=sunrise,sunset&wind_speed_unit=ms&timezone=Europe%2FBerlin&timeformat=unixtime&forecast_days=2&forecast_hours=24";

  if (http.begin(wifiClient, apiUrl)) {
    int httpCode = http.GET();
    
    if (httpCode > 0) {
      if (httpCode == HTTP_CODE_OK) {
        wetterdaten = http.getString();
      }
    }
  
  http.end();
  
  
  //Serial.println("---------Beginn Daten-----------------------------");
  //Serial.println(wetterdaten);
  //Serial.println("---------Ende Daten----------------------------------------------------------");
  

  }
  
return wetterdaten;

}

// ----------------------------------------------------------------------------

void wetterdaten_auswerten(const String& wetterdaten) {


JsonDocument filter;

JsonObject filter_hourly = filter["hourly"].to<JsonObject>();
filter_hourly["temperature_2m"][0] = true;
filter_hourly["relative_humidity_2m"][0] = true;
filter_hourly["precipitation"][0] = true;
filter_hourly["weather_code"][0] = true;
filter_hourly["wind_speed_10m"][0] = true;

JsonObject filter_daily = filter["daily"].to<JsonObject>();
filter_daily["sunrise"][0] = true;
filter_daily["sunset"][0] = true;


  //DynamicJsonDocument wetter(1000);
  //DeserializationError error = deserializeJson(wetter, wetterdaten);
  //DeserializationError error = deserializeJson(wetter, wetterdaten, DeserializationOption::Filter(filter));

  JsonDocument wetter;
  //DeserializationError error = deserializeJson(wetter, wetterdaten);
  DeserializationError error = deserializeJson(wetter, wetterdaten, DeserializationOption::Filter(filter));


  if (error) {
    Serial.print(F("Fehler beim Parsen der JSON-Daten: "));
    Serial.println(error.c_str());
    return;
  }

  JsonObject stunde = wetter["hourly"];
  
  Serial.print("temp. ");

  JsonArray stunde_temp = stunde["temperature_2m"];
  for (int i = 0; i < 5; i++) {
    temp[i] = stunde_temp[(i+1)*4] ;
  
    Serial.print(temp[i]);
    Serial.print("/");
  }

  Serial.println();
  Serial.print("luftfeuchte: ");

  JsonArray stunde_luftfeuchte = stunde["relative_humidity_2m"];
  for (int i = 0; i < 5; i++) {
    luftfeuchte[i] = stunde_luftfeuchte[(i+1)*4] ;
  
    Serial.print(luftfeuchte[i]);
    Serial.print("/");
    }

  Serial.println();
  Serial.print("niederschlag ");


  JsonArray stunde_niederschlag = stunde["precipitation"];
  for (int i = 0; i < 5; i++) {
    niederschlag[i] = stunde_niederschlag[(i+1)*4] ;
  
    Serial.print(niederschlag[i]);
    Serial.print("/");
    }

    Serial.println();
    Serial.print("wettercode ");

  JsonArray stunde_wettercode = stunde["weather_code"];
  for (int i = 0; i < 5; i++) {
    wettersymbol[i] = stunde_wettercode[(i+1)*4] ;
  
    Serial.print(wettersymbol[i]);
    Serial.print("/");
    }

  Serial.println();
  Serial.print("windgeschw. ");

  JsonArray stunde_windgeschwindigkeit = stunde["wind_speed_10m"];
  for (int i = 0; i < 5; i++) {
    windgeschwindigkeit[i] = stunde_windgeschwindigkeit[(i+1)*4] ;
  
    Serial.print(windgeschwindigkeit[i]);
    Serial.print("/");
    }

  Serial.println();
  
  JsonObject tag = wetter["daily"];

  Serial.print("sonnenaufgang ");

  JsonArray tag_sonnenaufgang = tag["sunrise"];
  for (int i = 0; i < 2; i++) {
    sonnenaufgang[i] = tag_sonnenaufgang[i] ;
  
    Serial.print(sonnenaufgang[i]);
    Serial.print("/");
    }

  Serial.println();
  Serial.print("sonnenuntergang ");

  JsonArray tag_sonnenuntergang = tag["sunset"];
  for (int i = 0; i < 2; i++) {
    sonnenuntergang[i] = tag_sonnenuntergang[i] ;
  
    Serial.print(sonnenuntergang[i]);
    Serial.print("/");
    }

  
  Serial.println();

}


// -------------------------------------------------------------------------------

void wifiConnect() {
WiFi.begin(wifi_ssid, wifi_password);
Serial.print("Connecting to WiFi ..");
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(250);
}
Serial.println(" connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());

}

// ----------------------------------------------------------------------------------

Bin etwas ratlos, was ich da falsch machen soll ...

cu

Welche Version von ArduinoJSON ist auf Ihrem Computer installiert, wenn Sie kompilieren?

ArduinoJson 7 released

1 Like

:woozy_face: Asche auf mein Haupt, ich war der festen Überzeugung da ist 7.0.2 drauf, tatsächlich war es noch eine 6er Version.
Und Wokwi bindet anscheinend immer die aktuellste Version ein, deshalb lief der schon etwas ältere Code dort problemlos.

cu

Wir sind alle schon mindestens einmal durch diese Situation gegangen... :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.