OneScript icon indicating copy to clipboard operation
OneScript copied to clipboard

Неправильно работает ЧтениеJSON.Пропустить()

Open Mr-Rm opened this issue 1 year ago • 5 comments

Опишите ошибку Неправильно работает ЧтениеJSON.Пропустить()

Воспроизведение ошибки

  1. Для простых значений:
Текст = "1,2,3,4,5";
Чтение = Новый ЧтениеJSON();
Чтение.УстановитьСтроку(Текст);
Результат = Чтение.Прочитать(); // считывает 1
Результат = Чтение.Пропустить(); // должно прочитать 2
Сообщить(Чтение.ТекущееЗначение));

Вывод: 3 Ожидаемое поведение Вывод: 2

  1. Для вложенных массивов:
Текст = "1,[2,[-1,-2],[-3,-4],3],4,5";
Чтение = Новый ЧтениеJSON();
Чтение.УстановитьСтроку(Текст);
Результат = Чтение.Прочитать(); // считывает 1
Результат = Чтение.Прочитать(); // считывает НачалоМассива
Результат = Чтение.Пропустить(); // должно пропустить масиив от '[2,' до ',3]' и считать 4; фактически: НачалоМассива '[-3,'
Результат = Чтение.Прочитать(); // должно прочитать 5, 
Сообщить(Чтение.ТекущееЗначение));

Вывод: -3 Ожидаемое поведение Вывод: 5

Аналогично для вложенных объектов.

Окружение

  • Версия: latest, develop

Дополнительная информация

Mr-Rm avatar Apr 22 '24 11:04 Mr-Rm

Оказалось, что 1С может пропускать некорректные конструкции:

Текст = "1,[2, } } { { [-1,-2], { { [-3,-4], 3], 4, 5, 6";
Чтение = Новый ЧтениеJSON();
Чтение.УстановитьСтроку(Текст);
Результат = Чтение.Прочитать(); // считывает 1
Результат = Чтение.Прочитать(); // считывает НачалоМассива
Результат = Чтение.Пропустить(); // пропускает массив от '[2,' до ',3]', несмотря на ошибки внутри
Сообщить(Чтение.ТекущееЗначение)); // 4

Newtonsoft-ский JsonReader на такое реагирует исключением. Не стоит повторять, баг в 1С?

Mr-Rm avatar Apr 23 '24 13:04 Mr-Rm

Давай сделаем, как проще. Мне сложно сказать, кто тут прав

EvilBeaver avatar Apr 24 '24 09:04 EvilBeaver

Обнаружено несоответствие в поведении ТекущаяПозиция() после чтения значений:

Текст = "1   , 2";
Чтение = Новый ЧтениеJSON();
Чтение.УстановитьСтроку(Текст);
Чтение.Прочитать();
Позиция = Чтение.ТекущаяПозиция

В OneScript Позиция = 1 - после значения, в 1С Позиция = 5 - после разделителя, несмотря на описание:

Указывает на позицию, находящуюся сразу после прочитанного значения.

Стоит ли заводить issue? Так придем к отказу от Newtonsoft.Json

Mr-Rm avatar May 16 '24 11:05 Mr-Rm

Для net6 он и так задепрекейчен в пользу родного, так что не очень страшно, если это поможет. С другой стороны, "Позиция" это не та функиональнность, без которой прям жить нельзя. Полагаю, на твое усмотрение.

EvilBeaver avatar May 17 '24 09:05 EvilBeaver

Уже смотрел в сторону родного (System.Text.Json). Там тоже есть проблемы, например:

Allow single quotes around string values ❌ Not supported by design

Это по стандарту, но несовместимо с 1С, которая такое позволяет.

Mr-Rm avatar May 17 '24 11:05 Mr-Rm