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

Ошибка парсера JSON

Motobiker

Member
Библиотека ArduinoJson 6.15.2

ошибка - IncompleteInput

У разработчика указано 3 варианта этой ошибки: пустой ввод, маленький буффер и таймайут при чтении из потока.

Судя по всему у меня что-то еще...

Код:
    File con_file = LittleFS.open(file_addr, "r");
    Serial.println("Size off " + file_addr + " - " + String(con_file.size()));
    Serial.print(con_file.readString());

    StaticJsonDocument<1024> doc;
    DeserializationError error = deserializeJson(doc, con_file);
    Serial.println(error.c_str());
Size off /def_config_1.json - 557

{"game_mode":1,"num_players":2,"num_targets":6,"num_attempts":5,"num_shots_1":12,"num_shots_2":8,"num_shots_3":6,"num_shots_4":6,"num_shots_5":6,"num_shots_6":6,"num_shots_7":6,"num_shots_8":6,"attempt_time":120,"game_time":false,"min_beer":200,"max_beer":400,"brightnes_bg":150,"brightnes_fr":150,"bg_light":true,"hited_light":true,"p1_color":"rgb(0, 255, 0)","p2_color":"rgb(0, 0, 255)","p3_color":"rgb(255, 0, 255)","p4_color":"rgb(255, 125, 0)","p5_color":"rgb(0, 255, 255)","p6_color":"rgb(0, 0, 0)","p7_color":"rgb(0, 0, 0)","p8_color":"rgb(0, 0, 0)"}

IncompleteInput
 

Юрий Ботов

Moderator
Команда форума
Не уверен, что ArduinoJson поддерживает булевы константы. Используйте 0/1 или "true"/"false" - в ковычках.
 

Motobiker

Member
Ничего странного. Так и надо делать. Оно же не понимает "вложенных кавычек". Для этого и придуман \" чтобы их "владывать" когда нужно.
Это я понимаю. Это актуально для string. Парсер же должен переваривать json файлы как есть, собственно, что он и делает.
В моем случае вылетает ошибка. Причем в пустом скетче все работает нормально...
Не пойму куда копать...
 

CodeNameHawk

Moderator
Команда форума
Это я понимаю. Это актуально для string. Парсер же должен переваривать json файлы как есть, собственно, что он и делает.
В моем случае вылетает ошибка. Причем в пустом скетче все работает нормально...
Не пойму куда копать...
Попробуйте памяти подкинуть для JSON.
p.s. Телепаты в отпуске.

Для строки из первого поста должно хватать.
https://arduinojson.org/v6/assistant/
 
Последнее редактирование:

Motobiker

Member
Попробуйте памяти подкинуть для JSON.
p.s. Телепаты в отпуске.

Для строки из первого поста должно хватать.
https://arduinojson.org/v6/assistant/
Спасибо, удобный сервис.

По сути проблема в том, что парсер не может переварить файл, начинку которого он же и создал.
В этом файле все ковычки указываются явно, а парсеру нужно - \"
 

enjoynering

Well-known member
Я одно не понимаю, у вас в проекте уже используется ArduinoJson, так зачем вы формируете JSON в ручную? Читать не удобно, есть вероятность совершить ошибку и тд.

Код:
"{\"hello\":\"world\"}";

Отдайте это дело библиотеке.

Код:
String info_sendVersionInfo()
{
  DynamicJsonDocument jsonDoc(FS_JSON_FILE_SIZE / 4);          //create json document in heap memory

  jsonDoc["version"] = VERSION_BUILD_V;
  jsonDoc["date"]    = VERSION_BUILD_D;
  jsonDoc["time"]    = VERSION_BUILD_T;

  String miniJsonStr;

  uint32_t minifiedSize = serializeJson(jsonDoc, miniJsonStr); //generate minified JSON & send it to string

  Serial.printf_P(PSTR("size of minified FW Version JSON %u bytes\n"), minifiedSize); //~58-bytes

  return miniJsonStr;
}
 

enjoynering

Well-known member
да и у вас ArduinoJson протух. На сегодня самая актуальная версия - 6.16.1
 

Motobiker

Member
Формирует JSON документ библиотека. "{\"hello\":\"world\"} - это для пробы я вводил, с этим все работает
Проблема в парсинге резльтирующего файла - IncompleteInput
 

Motobiker

Member
Всё заработало ))
Но только когда парсится до 4 параметров, при этом размер буффера более чем

Подразумевается, что test_file в нижеследующих кусках кода разный - в первом случае с 4 параметрами, во втором с 5ю.

так всё ОК
Код:
  StaticJsonDocument<1024> json_doc;

  DeserializationError error = deserializeJson(json_doc, test_file);
  if (error)
    Serial.println(F("Failed to read file, using default configuration"));
  Serial.println(error.c_str());

  str = json_doc["str"].as<String>();
  val = json_doc["val"];
  val1 = json_doc["val1"];
  val2 = json_doc["val2"];

  test_file.close();
  json_doc.clear();
так нет
Код:
  StaticJsonDocument<1024> json_doc;

  DeserializationError error = deserializeJson(json_doc, test_file);
  if (error)
    Serial.println(F("Failed to read file, using default configuration"));
  Serial.println(error.c_str());

  str = json_doc["str"].as<String>();
  val = json_doc["val"];
  val1 = json_doc["val1"];
  val2 = json_doc["val2"];
  val3 = json_doc["val3"];

  test_file.close();
  json_doc.clear();
 

Motobiker

Member
Почему он разный? Добавил пустое значение...
тут два случая.
в првом случае записывается файл с 4 параметрами
Код:
File test_file = LittleFS.open(filename, "w+");
  DynamicJsonDocument json_doc(1024);
  json_doc["str"] = "new stroka";
  json_doc["val"] = 17771;
  json_doc["val1"] = 17771;
  json_doc["val2"] = 17771;
во втором с 5 параметрами
Код:
File test_file = LittleFS.open(filename, "w+");
  DynamicJsonDocument json_doc(1024);
  json_doc["str"] = "new stroka";
  json_doc["val"] = 17771;
  json_doc["val1"] = 17771;
  json_doc["val2"] = 17771;
 json_doc["val3"] = 17771;
 

Motobiker

Member
Если парсить строку, то все OK, любое количество параметров переваривает
Код:
String SSS="{\"str\":\"11new stroka\",\"val\":17771,\"val1\":17771,\"val2\":17771,\"val3\":17771,\"val5\":17771,\"val6\":17771,\"val7\":17771,\"val8\":17771,\"val9\":17771,\"val10\":17771,\"val4\":17771}";
  DeserializationError error = deserializeJson(json_doc, SSS);
 
Сверху Снизу