Имя: Пароль:
1C
 
Функция ПрочитатьJSON молча выбрасывает кусок строки
0 TormozIT
 
гуру
19.08.22
19:43
Выполняю в консоли кода

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку("45 34534керапрапр");
Результат1 = ПрочитатьJSON(ЧтениеJSON);
Сообщить(Результат1);
Результат2 = ФабрикаXDTO.ПрочитатьJSON(ЧтениеJSON);

Получаю сообщения

45
Строка кода 5: Ошибка при вызове метода контекста (ПрочитатьJSON): Непредвиденный символ при чтении JSON

Получается глобальная функция ПрочитатьJSON молча выбрасывает кусок строки в то время, как фабричная функция ожидаемо выбрасывает исключение.
1. Это нормально?
Если да, то
2. Зачем так сделано?
3. Как убедиться что все было прочитано?
1 alarm2020
 
19.08.22
19:53
Если результат - структура, то все прочитано, иначе это не json
2 TormozIT
 
гуру
19.08.22
19:54
Еще в описании глобального метода указано
"JSON-текст должен быть корректным."
Получается этот текст он считает корректным?
3 TormozIT
 
гуру
19.08.22
19:56
(1) Нет. Глобальный метод ПрочитатьJSON() может вернуть
- число
- дата
- строка
- булево
- массив
- структура

Например

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку("true");
Результат1 = ПрочитатьJSON(ЧтениеJSON);
Сообщить(Результат1);

выведет

Да
4 TormozIT
 
гуру
19.08.22
19:58
(3) ну и Неопределено еще может вернуть конечно
5 TormozIT
 
гуру
19.08.22
20:07
В (0) некорректный тест в отношении фабричного метода. Но сути это не меняет.
Вот исправленный тест

Строка = "45 34534керапрапр";
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Строка);
Результат1 = ПрочитатьJSON(ЧтениеJSON);
Сообщить(1);
ЧтениеJSON.УстановитьСтроку(Строка);
Результат2 = ФабрикаXDTO.ПрочитатьJSON(ЧтениеJSON);
6 TormozIT
 
гуру
19.08.22
20:14
3. Как убедиться что все было прочитано?
Нашел такой способ - ЧтениеJSON.ТекущаяПозиция = СтрДлина(Строка)

Строка = "[null] 435";
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Строка);
Результат1 = ПрочитатьJSON(ЧтениеJSON);
ВсеПрочитано = ЧтениеJSON.ТекущаяПозиция = СтрДлина(Строка);
Сообщить(ВсеПрочитано);
7 TormozIT
 
гуру
19.08.22
20:25
1. Это нормально?
Ответ: Да
2. Зачем так сделано?
Ответ: Это аналог метода ПрочитатьXML. Поэтому он читает текущее значение/объект из потока чтения, а не весь поток до конца как я ошибочно полагал.
8 alarm2020
 
19.08.22
20:41
И все-таки. Если результат структура или массив - это JSON в общепризнанном смысле. Если нет - не JSON. Я считаю, что правильнее будет ориентироваться на общепризнанное, а не на интерпретацию от 1С.
9 ДедМорроз
 
20.08.22
06:11
Нет,а что вы хотите.
Вы пихаете ему на вход неизвестно что,поэтому метод делает то,что умеет.
Просто,число состоит только из цифр и дополнительный знаков .e
Строка пишется в кавычках(по стандарту в двойных,но парсер,обычно,понимает и одинарные)
Далее,есть функция преобразования строки в число в 1с - она тоже странно работает,так как отбрасывает символы,что в вашем случае и происходит.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший