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