• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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());
 
Сверху Снизу