Skip to content

ЧтениеJSON не корректно читает значение типа Строка, если оно содержит дату в формате ISO #1681

@leemuar

Description

@leemuar

Опишите ошибку
Есть объект для последовательного чтения json - ЧтениеJSON.
Когда значение свойства json это строка и эта строка содержит дату в формате ISO ("2026-05-13T22:51:46Z") - ЧтениеJSON вместо того чтобы определить тип такого значения как ТипТекущегоЗначения.Строка - возвращает ТипТекущегоЗначения.Ничего. Соответственно и значение получить не получается т.к. при типе ТипТекущегоЗначения.Ничего обращение к ТекущееЗначение генерирует исключение.

Другими словами значение такого свойства просто невозможно получить

Воспроизведение ошибки
Steps to reproduce the behavior:

Вот тест, демонстрирующий это поведение.

Для json вида { "lastSignInTime"": ""2026-05-13T22:51:46Z" } ожидаем, что при чтении объектом ЧтениеJSON типы будут такие:
НачалоОбъекта - ИмяСвойства - Строка - КонецОбъекта
Фактически получаем:
НачалоОбъекта - ИмяСвойства - Ничего - КонецОбъекта

// проверяемая строка json
СтрокаJSON = "{ ""lastSignInTime"": ""2026-05-13T22:51:46Z"" }";

// какие типы должны быть при последовательном чтении
ЭталонЗначения = Новый Массив;
ЭталонЗначения.Добавить( ТипЗначенияJSON.НачалоОбъекта );
ЭталонЗначения.Добавить( ТипЗначенияJSON.ИмяСвойства );
ЭталонЗначения.Добавить( ТипЗначенияJSON.Строка );
ЭталонЗначения.Добавить( ТипЗначенияJSON.КонецОбъекта );

// читаем последовательно строку json и собираем типы значений по порядку
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
ФактЗначения = Новый Массив;
Пока ЧтениеJSON.Прочитать() Цикл
    ФактЗначения.Добавить( ЧтениеJSON.ТипТекущегоЗначения );
КонецЦикла;
ЧтениеJSON.Закрыть();

// проверяем что эталон и факт данные идентичны
Если ЭталонЗначения.Количество() <> ФактЗначения.Количество() Тогда
	ВызватьИсключение "Разное количество эталонных и фактических данных";
КонецЕсли;

Для Сч = 0 По ЭталонЗначения.ВГраница() Цикл
	Если ЭталонЗначения[Сч] <> ФактЗначения[Сч] Тогда
		ВызватьИсключение СтрШаблон( 
			"Значения типов не равны, номер по порядку: %1, ожидали: %2, получили: %3", 
			Сч, 
			ЭталонЗначения[Сч], 
			ФактЗначения[Сч] 
		);
	КонецЕсли;
КонецЦикла;

Ожидаемое поведение
ЧтениеJSON должен устанавливать свое свойство в значение ТипТекущегоЗначения.Строка и в свойстве ТекущееЗначение должна быть прочитанная строка значения свойства из json

В платформе 1С это работает корректно:

Image

Окружение

  • ОС: Windows
  • Версия: 2.0.1

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

Есть подозрение, что рантайм движка автоматически распознает в строках json дату в формате ISO и конвертирует ее в тип Дата,хотя его никто не просил и отключить это поведение никак нельзя. Эти подозрения вызваны наблюдением за тем как работает ПрочитатьJSON - оно такие строки конвертирует в Дата, хотя никакого указания так делать не было.

Вот код, демонстрирующий это. В платформе 1С он работает корректно - такая строка не преобразуется в Дата сама по себе. В onescript в свойстве lastSignInTime будет значение типа Дата, должно быть Строка

// проверяемая строка json
СтрокаJSON = "{ ""lastSignInTime"": ""2026-05-13T22:51:46Z"" }";

// читаем json в структуру
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Объект = ПрочитатьJSON(ЧтениеJSON);

Ожидаем = Тип("Строка");
Факт = ТипЗнч( Объект.lastSignInTime );
Если Факт <> Ожидаем Тогда
	ВызватьИсключение СтрШаблон( 
		"Типы отличаются, ожидали: %1, получили: %2", 
		Ожидаем, 
		Факт
	);
КонецЕсли;

В комментариях к версии рантайма 1.0.21 упоминается такое изменение - Исправлена ошибка: в ЧтениеJSON не обрабатывались значения типа DateTime. Может быть связано с текущей ошибкой

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions