• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

arduinojson с 5 на 6 проблемы при сохранении

leftms

New member
Всем привет!
Обновил библиотеку arduinojson с 5 на 6версию, в ней синтаксис немного поменялся.
Фаил Json лежит в esp8266, данные нормально считываю, а вот при попытке записать (обновить) данные, затираются все кроме добавленного параметра
Работающая функция в 5ой версии, которая обнавляет нужный параметр edit_var на значение var :
C++:
void saveConfig(String edit_var, String value) {
  DynamicJsonBuffer jsonBuffer;
  JsonObject& json = jsonBuffer.parseObject(jsonConfig);
  json[edit_var] = value;
  json.printTo(jsonConfig);
  // Открываем файл для записи
  File f = SPIFFS.open(dev_config_file, "w");
  json.printTo(f);
  f.close();
}
А вот в 6-ой версии:
C++:
void saveConfig(String edit_var, String value) {
      File  f = SPIFFS.open(dev_config_file, "w");
      DynamicJsonDocument doc(1024);
      doc[edit_var] = value;
      serializeJson(doc, f);      
      f.close();
}
Или в таком варианте:
Код:
    File f = SPIFFS.open(dev_config_file, "w");
    jsonConfig = f.readString();            
     DynamicJsonDocument doc(capacity);
     DeserializationError error = deserializeJson(doc, jsonConfig);
     doc[edit_var] = value;
     serializeJson(doc, f);
     f.close();
Вставляет только указанные параметры, т.е. не берет данные с файла, а просто вставляет 1 значение, если добавить еще строку doc["параметр1"] = "значение"; он ее тоже добавляет.
Даже если открыть фаил с параметром "а", то в конец запишет только указанный параметр, как можно сделать что бы из файла загрузились все параметры в doc
Параметр 1 =
Параметр 2 =
.....
, а затем в нем поменять?
 

Ildarmustafin86

Active member
У меня вот так работает.
C++:
String jsonWrite(String &json, String name, float volume) {
  DynamicJsonDocument root(3072);
  deserializeJson(root, json);
  root[name]= volume;
  json = "";
  serializeJson(root, json);
  return json;
}
void saveConfig(String fileName, String strings) {
  File configFile = LittleFS.open(fileName, "w");
  configFile.print(strings);
  configFile.close();
}
String readFile(String fileName, size_t len) {
  File configFile = LittleFS.open(fileName, "r");
  DEBUG_PRINT("\nFile: %s | size: %i\n", fileName.c_str(), configFile.size());
  String cSetup = configFile.readString();
  configFile.close();
  return cSetup;
}

configSetup = readFile("/configSetup.json", 1024);

jsonWrite(configSetup, "defaultFloat", defFloat);

saveConfig("/configSetup.json", configSetup);
 

leftms

New member
У меня вот так работает.
C++:
String jsonWrite(String &json, String name, float volume) {
  DynamicJsonDocument root(3072);
  deserializeJson(root, json);
  root[name]= volume;
  json = "";
  serializeJson(root, json);
  return json;
}
void saveConfig(String fileName, String strings) {
  File configFile = LittleFS.open(fileName, "w");
  configFile.print(strings);
  configFile.close();
}
String readFile(String fileName, size_t len) {
  File configFile = LittleFS.open(fileName, "r");
  DEBUG_PRINT("\nFile: %s | size: %i\n", fileName.c_str(), configFile.size());
  String cSetup = configFile.readString();
  configFile.close();
  return cSetup;
}

configSetup = readFile("/configSetup.json", 1024);

jsonWrite(configSetup, "defaultFloat", defFloat);

saveConfig("/configSetup.json", configSetup);
Ildarmustafin86 Огромное спасибо!!! Все отлично заработало
Единственное закомментировал:
Код:
  //DEBUG_PRINT("\nFile: %s | size: %i\n", fileName.c_str(), configFile.size());
 
Сверху Снизу