ArduinoJson Library Wert ändern?

Hallo Zusammen,
ich nutze die ArduinoJson Library (Link) um JSON Dateien anzulegen und auszulesen.

Erstellen kann ich Objekte mit:

  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& json = jsonBuffer.createObject();
  
  json["Vorname"] = "Max";
  json["Name"] = "Mustermann";
  ....

Und Auslesen mit :

  std::unique_ptr<char[]> buf(new char[size]);

  configFile.readBytes(buf.get(), size);

  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& json = jsonBuffer.parseObject(buf.get());

 String result = json["Name"];

Wie kann ich nun die Value eines Objektes ändern? Ich möchte quasi den Schlüssel zur Identifizierung des Objektes nutzen, um dann den Wert zu ändern. Dies geht hoffentlich ähnlich simpel wie Schreiben und Lesen?

Bsp.
ChangeValue(“Schlüssel”,“Neuer Wert”)

Wenn du schreiben kannst, wieso kannst du den Wert dann nicht ändern?
Oder verstehe ich deine Frage nicht?

Dann verrate uns wenigstens wie du es gelöst hast, damit spätere Suchende die Lösung schneller finden.

Ist eindeutig zu spät für Änderungen. Hab es doch nicht gelöst bekommen. Hier ist mein Demo Sketch:

Hauptprogramm

#include <ArduinoJson.h>
#include <FS.h>

#include "Config.h"

void setup() {
  delay(10);
  Serial.begin(115200);
  Serial.println("");
  delay(10);

  MOUNT_SPIFFS();

  if (!CreateDemoData("/config.json")) {
    Serial.println("Fehler: Demodaten konnten nicht gespeichert werden");
  } else {
    Serial.println("Demodaten wurden angelegt");
  }

  Set_Value("/config.json","SSID","enter123");

  Serial.println("");
  Serial.println("Ausgabe Demodaten...");
  Serial.println("");

  Serial.println("SSID: " + loadValue("/config.json","SSID"));
  Serial.println("PW: " + loadValue("/config.json","Passwort"));

  Serial.println("");
  Serial.println("Ausgabe JSON File Gesamt...");
  Serial.println("");

  Serial.println(printFile("/config.json"));
 
}

void loop() {
}

Config.h

//================================================================================================
//====================================== SPIFFS MOUNTEN ==========================================
//================================================================================================

void MOUNT_SPIFFS() {
  
  if (!SPIFFS.begin()) {
    Serial.println("Fehler: Dateisystem konnte nicht eingebunden werden");
    return;
  }
  
}
//================================================================================================
//========================================== Laden ===============================================
//================================================================================================

String loadValue(String Path, String Name) {
  
  File configFile = SPIFFS.open(Path, "r");
  if (!configFile) {
    Serial.println("Fehler: Die Datei " +  Path + " konnte nicht geöffnet werden");
    return "Fehler";
  }
  
  size_t size = configFile.size();
  if (size > 1024) {
    Serial.println("Fehler: Die Datei ist zu groß");
    return "Fehler";
  }

  // Allocate a buffer to store contents of the file.
  std::unique_ptr<char[]> buf(new char[size]);

  // We don't use String here because ArduinoJson library requires the input
  // buffer to be mutable. If you don't use ArduinoJson, you may as well
  // use configFile.readString instead.
  configFile.readBytes(buf.get(), size);

  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& json = jsonBuffer.parseObject(buf.get());

  if (!json.success()) {
    Serial.println("Fehler: Parsen fehlgeschlagen. Name: " + Name);
    return "Fehler";
  }

  String result = json[Name];
  
  return result;
}

//================================================================================================
//===================================== DEMODATEN ANLEGEN ========================================
//================================================================================================

bool CreateDemoData(String Path) {
  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& json = jsonBuffer.createObject();
  
  json["SSID"] = "DEMO_SSID";
  json["Passwort"] = "123456789";
  json["Passwort"] = "DOCH_LIEBER_23456";

  File configFile = SPIFFS.open(Path, "w");
  if (!configFile) {
    return false;
  }

  json.printTo(configFile);
  return true;
}

//================================================================================================
//==================================== Value aktualisieren =======================================
//================================================================================================

bool Set_Value(String Path, String Key, String Value) {
  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& json = jsonBuffer.createObject();
  
  json[Key] = Value;

  File configFile = SPIFFS.open(Path, "w");
  if (!configFile) {
    return false;
  }

  json.printTo(configFile);
  return true;
}

//================================================================================================
//==================================== Ganze Datei ausgeben ======================================
//================================================================================================

String printFile(String Path) {

  File f = SPIFFS.open(Path, "r");
  return f.readStringUntil('\n');

}

Mein Problem ist folgendes. Wie man in der Config.h unter CreateDemoData sieht, kann ich den Key “Passwort” überschreiben (updaten) indem ich Ihn mehrfach aufführe. Nun möchte ich aber NACHträglich Änderungen vornehmen. Dies habe ich mit der Funktion Set_Value versucht. Mache ich es so, überschreibt mir die Funktion aber die gesamte Datei, wonach meine JSON Datei nur noch so aussieht:
{“SSID”:“enter123”}

Wie geht es richtig?

Da hat der Prozessor aber Recht, wenn er das so macht. Das hast Du ihm doch so gesagt.
Du legst in Set_Value ein neues JSON-Objekt an, das ist leer. Dann setzt Du einen Wert und dann schreibst Du es ins File. Da kann ja nur ein Wert drin sein.

Lies mal das JSON-Object aus dem File, ändere den Wert und speichere es wieder.

Gruß Tommy

Tommy56:
Lies mal das JSON-Object aus dem File, ändere den Wert und speichere es wieder.

Genau das habe ich vor, weiss aber leider nicht wie :frowning: Kannst du mir da bitte helfen?

Du hast die Leseroutine doch schon geschrieben. Da hast Du dann ein JSON objekt (nach parseObject). Dort setzt Du Deinen Wert und schreibst es wieder Weg.

Alles Teile, die Du in Deinem Code schon geschrieben hast. Das bekommst Du selbst hin.

Gruß Tommy

Ich würde nicht immer wieder auf eine Antwort warten, wenn ich es selbst hin bekommen würde. Ich hab es mehrfach versucht. Aber immer wird mein gesamtes Dokument überschrieben und es bleibt nur noch der von mir geänderte Wert :confused:

ungetestet und nur aus Deinem Code zusammen kopiert:

String myFunction(Parameter einfügen) {
...
  // Allocate a buffer to store contents of the file.
  std::unique_ptr<char[]> buf(new char[size]);

  // We don't use String here because ArduinoJson library requires the input
  // buffer to be mutable. If you don't use ArduinoJson, you may as well
  // use configFile.readString instead.
  configFile.readBytes(buf.get(), size);

  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& json = jsonBuffer.parseObject(buf.get());
  
  if (!json.success()) {
    Serial.println("Fehler: Parsen fehlgeschlagen. Name: " + Name);
    return "Fehler";
  }
   // json sollte Deine Daten beinhalten
   // Kontrollausgabe einbauen
  
  // Wert ändern

  json["Passwort"] = "abcdef";

  // Wegschreiben
  File configFile = SPIFFS.open(Path, "w");
  if (!configFile) {
    return "Error";
  }

  json.printTo(configFile);
  return "OK;
}

Gruß Tommy

So ähnlich hatte ich es selbst probiert. Klappt aber nicht.
Ich bekomme keine Fehlermeldung, aber das Passwort wird auch nicht geändert :frowning:

Hier der Code mit meinen Kommentaren:

String myFunction(String Path) {

  //Hier öffne ich meine JSON Datei vom Filesystem
  File configFile = SPIFFS.open(Path, "r");
  if (!configFile) {
    Serial.println("Fehler: Die Datei " +  Path + " konnte nicht geöffnet werden");
    return "Fehler";
  }

  //Hier prüfe ich ob die Datei zu groß ist
  size_t size = configFile.size();
  if (size > 1024) {
    Serial.println("Fehler: Die Datei ist zu groß");
    return "Fehler";
  }
  
  std::unique_ptr<char[]> buf(new char[size]);

  configFile.readBytes(buf.get(), size);

  //Hier wird der Inhalt der config.json Dateu in "json" gepackt
  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& json = jsonBuffer.parseObject(buf.get());
  
  if (!json.success()) {
    Serial.println("Fehler: Parsen fehlgeschlagen");
    return "Fehler";
  }

  //So wie ich das verstehe, sollte diese Zeile die Value vom
  //Schlüssel "Passwort" auf "abcdef" ändern
  json["Passwort"] = "abcdef";

  //Bearbeitete Datei zurück in config File packen
  json.printTo(configFile);
  return "OK";
}

Liest Du evtl.immer die Datei ein, in der nur noch der eine Wert steht?

Ansonsten gib mal nach dem Parsen alle Werte aus json auf Serial.println() aus.

Gruß Tommy

Ich glaube wir sind der Lösung eng auf der Spur. Aber verstehe gerade gar nicht was abgeht :o
Das ist die Ausgabe meines Serial Monitors:

Demodaten wurden angelegt
{"SSID":"DEMO_SSID","Passwort":"123456789"}
{"SSID":"enter123","Passwort":"123456789"}
Werte erfolgreich geändert

Ausgabe JSON File Gesamt...

{"SSID":"DEMO_SSID","Passwort":"123456789"}{"SSID":"enter123","Passwort":"123456789"}

Wie kann unter “Demodaten wurden angelegt” bereits folgendes stehen?
{“SSID”:“enter123”,“Passwort”:“123456789”}

Hier mal der ganze Ablauf mit Kommentaren:

void setup() {
  
  //Serielle Verbindung aufbauen
  delay(10);
  Serial.begin(115200);
  Serial.println("");
  delay(10);
  
  //SPIFFS einhängen
  MOUNT_SPIFFS();

  //CreateDemoData ausführen
  if (!CreateDemoData("/config.json")) {
    Serial.println("Fehler: Demodaten konnten nicht gespeichert werden");
  } else {
    Serial.println("Demodaten wurden angelegt");
  }
  
  //Datei in Monitor schreiben (Sollte eigentlich nur Demodaten anzeigen)
  Serial.println(printFile("/config.json"));
  
  //Set_Value ausführen
  if (Set_Value("/config.json","SSID","enter123")) {
    Serial.println("Werte erfolgreich geändert");
  }
  
  //Erneut die Datei in Monitor schreiben (Sollte nun die Demodaten mit geänderter SSID enthalten)
  Serial.println("");
  Serial.println("Ausgabe JSON File Gesamt...");
  Serial.println("");

  Serial.println(printFile("/config.json"));
 
}

Und hier die Einzelroutinen:

//================================================================================================
//====================================== SPIFFS MOUNTEN ==========================================
//================================================================================================

void MOUNT_SPIFFS() {
  
  if (!SPIFFS.begin()) {
    Serial.println("Fehler: Dateisystem konnte nicht eingebunden werden");
    return;
  }
  
}

//================================================================================================
//===================================== DEMODATEN ANLEGEN ========================================
//================================================================================================

bool CreateDemoData(String Path) {
  StaticJsonBuffer<200> jsonBuffer;
  
  //JSON anlegen
  JsonObject& json = jsonBuffer.createObject();

  //JSON - Objekte anlegen
  json["SSID"] = "DEMO_SSID";
  json["Passwort"] = "123456789";

  //Möglicherweise vorhandene Datei (Path) aus SPIFFS löschen
  SPIFFS.remove(Path);

  //Neue Datei anlegen
  File configFile = SPIFFS.open(Path, "w");
  if (!configFile) {
    return false;
  }

  //JSON in neue Datei schreiben
  json.printTo(configFile);
  return true;
}


//================================================================================================
//==================================== Value aktualisieren =======================================
//================================================================================================


bool Set_Value(String Path, String Key, String Value) {

  //Hier öffne ich meine JSON Datei vom Filesystem
  File configFile = SPIFFS.open(Path, "r+");
  if (!configFile) {
    Serial.println("Fehler: Die Datei " +  Path + " konnte nicht geöffnet werden");
    return "Fehler";
  }

  //Hier prüfe ich ob die Datei zu groß ist
  size_t size = configFile.size();
  if (size > 1024) {
    Serial.println("Fehler: Die Datei ist zu groß");
    return "Fehler";
  }
  
  std::unique_ptr<char[]> buf(new char[size]);

  configFile.readBytes(buf.get(), size);

  //Hier wird der Inhalt der config.json Dateu in "json" gepackt
  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& json = jsonBuffer.parseObject(buf.get());
  
  if (!json.success()) {
    Serial.println("Fehler: Parsen fehlgeschlagen. Name: ");
    return "Fehler";
  }


  //So wie ich das verstehe, sollte diese Zeile die Value vom
  //Schlüssel "Passwort" auf "abcdef" ändern
  json[Key] = Value;

  //Bearbeitete Datei zurück in config File packen
  json.printTo(configFile);

  json.printTo(Serial);
  Serial.println("");
  return "OK";
}

//================================================================================================
//==================================== Ganze Datei ausgeben ======================================
//================================================================================================

String printFile(String Path) {

  File f = SPIFFS.open(Path, "r");
  return f.readStringUntil('\n');

}

Du sollst doch keine Demodaten anlegen, sondern das angelegte File einlesen.

Gruß Tommy

Die Demodaten lege ich immer am Start an, da dies den späteren Sketch simuliert.
Da werden die Daten zu Anfang dann aus dem Internet heruntergeladen und dann zur Laufzeit modifiziert und abgespeichert.. Um das zu testen, lege ich also im Moment immer manuell Demodaten an.

Ich hatte doch geschrieben, dass Du die Werte aus json nach dem Einlesen auf Serial ausgeben sollst. Davon sehe ich in Deinem Code nichts.
Nicht das ganze File, sondern die nach dem Parsen und vor der Änderung vorhandenen Werte. Dann machst Du die Änderung und dann gibst Du sie wieder aus und dann schreibst Du das json wieder weg.

Wenn Du immer alles mögliche andere machst, wird das nix.

Gruß Tommy

Das verstehe ich nicht ganz. Ich hab jetzt den kompletten Quellcode aufgeräumt und die Abfrage nochmal besser strukturiert. Wenigstens konnte ich somit den Fehler ausfindig machen. Die Ausgabe im Serial Monitor sieht jetzt super aus:

-1. Demodaten anlegen
-2. Ausgabe der ganzen Datei
-3. Ändern der SSID
-4. Ausgabe der ganzen Datei

Demodaten wurden angelegt

==================================== /config.json ====================================

{"SSID":"DEMO_SSID","Passwort":"123456789"}

=======================================================================================

Werte erfolgreich geändert

==================================== /config.json ====================================

{"SSID":"DEMO_SSID","Passwort":"123456789"}{"SSID":"enter123","Passwort":"123456789"}

=======================================================================================

Der Fehler liegt in Schritt 4. Die SSID wird geändert, was auch super funktioniert, jedoch wird dann sowohl das vorher eingelesene Dokument PLUS das eingelesene Dokument mit geänderten Daten zusammengeschrieben. Jedoch will ich NUR das eingelesene Dokument mit den geänderten Daten haben. Das hast du mir ja auch schon gesagt und der Fehler liegt zu 100% auf meiner Seite, nur kann ich deiner Anweisung nicht ganz folgen. Wie muss ich jetzt Schritt 4 abändern, dass beschriebenes umgesetzt wird?

Habe das Gefühl das json.printTo(configFile); mir mein JSON hinten dran hängt… wie kann ich denn die ganze Datei überschreiben? Das ist jetzt ja wieder Aufgabe der SPIFFS Library :confused:

bool Set_Value(String Path, String Key, String Value) {

  File configFile = SPIFFS.open(Path, "r+");
  if (!configFile) {
    Serial.println("Fehler: Die Datei " +  Path + " konnte nicht geöffnet werden");
    return false;
  }

  //Hier prüfe ich ob die Datei zu groß ist
  size_t size = configFile.size();
  if (size > 1024) {
    Serial.println("Fehler: Die Datei ist zu groß");
    return false;
  }
  
  std::unique_ptr<char[]> buf(new char[size]);

  configFile.readBytes(buf.get(), size);

  //Hier wird der Inhalt der config.json Dateu in "json" gepackt
  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& json = jsonBuffer.parseObject(buf.get());
  
  if (!json.success()) {
    Serial.println("Fehler: Parsen fehlgeschlagen");
    return false;
  }

  json[Key] = Value;

  json.printTo(configFile);

  configFile.close();
  
  return true;
}

Das ist nicht Aufgabe der SPIFFS-Lib, sondern Deine Aufgabe als Programmierer :wink:
Ich nehme jetzt nur den relevanten Codeausschnitt.

  //So wie ich das verstehe, sollte diese Zeile die Value vom
  //Schlüssel "Passwort" auf "abcdef" ändern
  json["Passwort"] = "abcdef";
  
  // auf Anfang der Datei positionieren
  configFile.seek(0,SeekSet);  

  //Bearbeitete Datei zurück in config File packen
  json.printTo(configFile);

oder wenn das nicht geht Variante 2:

  //gelesenes File schließen.
  configFile.close();
  
  //So wie ich das verstehe, sollte diese Zeile die Value vom
  //Schlüssel "Passwort" auf "abcdef" ändern
  json["Passwort"] = "abcdef";
  
  // File neu öffnen
  File configFile = SPIFFS.open(Path, "w");
  if (!configFile) {
    return false;
  }

  //Bearbeitete Datei zurück in config File packen
  json.printTo(configFile);

Gruß Tommy

Welche Variante hast Du getestet? Die mit seek?

Schön, wenn es funktioniert. Die Lib gehört nicht zu den übersichtlichsten. Wenn Du wirklich nur SSID und Passwort speichern willst, warum machst Du diesen Aufwand? Da würde eine Textdatei genügen oder die Werte im Code lassen.

Ich habe JSON auf dem Arduino/NodeMCU bisher immer händisch zusammen geklöppelt.

Gruß Tommy

Tommy56, ich bin dir unglaublich dankbar. Stark das du dir so viel Zeit genommen hast. Jetzt klappt alles wie gewünscht!!

Ich habe die Seek Variante genutzt. Langfristig möchte ich nicht nur SSID und PW speichern, aber das war jetzt ein gutes Beispiel :slight_smile: Vielleicht nochmal für alle, die ähnliches brauchen den kompletten Code mit Tommys Lösungen. Vielleicht findet sich so ja über die Zeit noch eine bessere Methode.

Hier der Hauptcode, welchen ich so schmal wie möglich halten wollte:

#include <ArduinoJson.h>
#include <FS.h>

#include "Config.h"

void setup() {
  delay(10); Serial.begin(115200); delay(10);
  
  Start_SPIFFS();

  CreateDemoData("/config.json", true);
  
  PrintFile("/config.json");

  Change_Config("/config.json","SSID","NEUE SSID", true);

  PrintFile("/config.json");
 
}

void loop() {
}

Hier die Config.h

//================================================================================================
//====================================== SPIFFS MOUNTEN ==========================================
//================================================================================================

void Start_SPIFFS() {
  
  if (!SPIFFS.begin()) {
    Serial.println("Fehler: Dateisystem konnte nicht eingebunden werden");
    return;
  }
  
}
//================================================================================================
//========================================== Laden ===============================================
//================================================================================================

String loadValue(String Path, String Name) {
  
  File configFile = SPIFFS.open(Path, "r");
  if (!configFile) {
    Serial.println("Fehler: Die Datei " +  Path + " konnte nicht geöffnet werden");
    return "Fehler";
  }
  
  size_t size = configFile.size();
  if (size > 1024) {
    Serial.println("Fehler: Die Datei ist zu groß");
    return "Fehler";
  }

  // Allocate a buffer to store contents of the file.
  std::unique_ptr<char[]> buf(new char[size]);

  // We don't use String here because ArduinoJson library requires the input
  // buffer to be mutable. If you don't use ArduinoJson, you may as well
  // use configFile.readString instead.
  configFile.readBytes(buf.get(), size);

  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& json = jsonBuffer.parseObject(buf.get());

  if (!json.success()) {
    Serial.println("Fehler: Parsen fehlgeschlagen. Name: " + Name);
    return "Fehler";
  }

  String result = json[Name];
  
  return result;
}

//================================================================================================
//===================================== DEMODATEN ANLEGEN ========================================
//================================================================================================

void CreateDemoData(String Path, bool debug) {

  SPIFFS.remove(Path); 
  
  StaticJsonBuffer<200> jsonBuffer;
  
  //JSON anlegen
  JsonObject& json = jsonBuffer.createObject();

  //JSON - Objekte anlegen
  json["SSID"] = "DEMO_SSID";
  json["Passwort"] = "123456789";

  //Möglicherweise vorhandene Datei (Path) aus SPIFFS löschen
  SPIFFS.remove(Path);

  //Neue Datei anlegen
  File configFile = SPIFFS.open(Path, "w");
  if (!configFile) {

    if (debug) {
    Serial.println("Fehler: Demodaten konnten nicht gespeichert werden");
    }

  }

  json.printTo(configFile);
  
  if (debug) {
    Serial.println("Demodaten wurden angelegt");
  }

}

//================================================================================================
//==================================== Value aktualisieren =======================================
//================================================================================================


bool Change_Config(String Path, String Key, String Value, bool debug) {

  File configFile = SPIFFS.open(Path, "r+");
  if (!configFile) {
    Serial.println("Fehler: Die Datei " +  Path + " konnte nicht geöffnet werden");
    return false;
  }

  //Hier prüfe ich ob die Datei zu groß ist
  size_t size = configFile.size();
  if (size > 1024) {
    Serial.println("Fehler: Die Datei ist zu groß");
    return false;
  }
  
  std::unique_ptr<char[]> buf(new char[size]);

  configFile.readBytes(buf.get(), size);

  //Hier wird der Inhalt der config.json Dateu in "json" gepackt
  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& json = jsonBuffer.parseObject(buf.get());
  
  if (!json.success()) {
    Serial.println("Fehler: Parsen fehlgeschlagen");
    return false;
  }

  json[Key] = Value;

  configFile.seek(0,SeekSet);
  
  json.printTo(configFile);

  if (debug) {
    Serial.println("Werte erfolgreich geändert");
  }

  return true;
}

//================================================================================================
//==================================== Ganze Datei ausgeben ======================================
//================================================================================================

void PrintFile(String Path) {
  
  Serial.println("");
  Serial.println("==================================== " + Path + " ====================================");
  Serial.println("");
  
  File f = SPIFFS.open(Path, "r");
  Serial.println( f.readStringUntil('\n') );

  Serial.println("");
  Serial.println("=======================================================================================");
  Serial.println("");
}

Hier die Ausgabe im SM:

Demodaten wurden angelegt

==================================== /config.json ====================================

{"SSID":"DEMO_SSID","Passwort":"123456789"}

=======================================================================================

Werte erfolgreich geändert

==================================== /config.json ====================================

{"SSID":"NEUE SSID","Passwort":"123456789"}

=======================================================================================

Die Funktion loadValue habe ich jetzt immer nur mitgenommen. Diese stammt noch aus meinen ersten Versuchen und funktioniert u.U. aktuell nicht bzw. muss noch angepasst werden. Darum kümmere ich mich später.

Nochmal vielen Dank an Tommy!!

Edit:
Wer noch nie SPIFFS auf seinem Controller genutzt hat muss erstmal formatieren… Also nicht verzweifeln :slight_smile:
SPIFFS.format()

Referenz: https://github.com/esp8266/Arduino/blob/master/doc/filesystem.md#format

Ups!! Gefährlich!! Wenn man den Cursor mit configFile.seek(0,SeekSet); an den Anfang der Datei setzt, die geänderten Werte aber kürzer sind als die alten Werte, bleibt ein hässlicher Schnipsel am Ende stehen.
Ich habe nun z.B. die SSID und das Passwort auf “” gesetzt. Ergebnis ist dieses:

{“SSID”:"",“Passwort”:""}3456789"}3456789"}

Gibt es also noch eine andere Möglichkeit, die configFile zu leeren?

Sonst funktioniert Tommys 2. Variante auch, allerdings wird die Datei dann unnötigerweise zweimal geöffnet und ich könnte mir vorstellen, das dass Leistung kostet. Nebenbei… Macht es eigentlich sinn die Dateien jedes mal auch zu schließen? Aktuell schließe ich ja nie…

Anpassung mit Tommys 2. Variante:

bool Change_Config(String Path, String Key, String Value, bool debug) {

  File configFile = SPIFFS.open(Path, "r");
  if (!configFile) {
    Serial.println("Fehler: Die Datei " +  Path + " konnte nicht geöffnet werden");
    return false;
  }

  //Hier prüfe ich ob die Datei zu groß ist
  size_t size = configFile.size();
  if (size > 1024) {
    Serial.println("Fehler: Die Datei ist zu groß");
    return false;
  }
  
  std::unique_ptr<char[]> buf(new char[size]);

  configFile.readBytes(buf.get(), size);

  //Hier wird der Inhalt der config.json Dateu in "json" gepackt
  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& json = jsonBuffer.parseObject(buf.get());
  
  if (!json.success()) {
    Serial.println("Fehler: Parsen fehlgeschlagen");
    return false;
  }

  json[Key] = Value;

  //configFile.seek(0,SeekSet);

  File configFileModified = SPIFFS.open(Path, "w");
  if (!configFileModified) {
    Serial.println("Fehler: Die Datei " +  Path + " konnte nicht geöffnet werden");
    return false;
  }
  
  json.printTo(configFileModified);

  if (debug) {
    Serial.println("Wert erfolgreich geändert");
  }

  return true;
}