diff --git a/src/OneScript.StandardLibrary/Json/JSONReader.cs b/src/OneScript.StandardLibrary/Json/JSONReader.cs index 866cd54b9..aa588f4ba 100644 --- a/src/OneScript.StandardLibrary/Json/JSONReader.cs +++ b/src/OneScript.StandardLibrary/Json/JSONReader.cs @@ -23,6 +23,8 @@ internal class JsonReaderInternal: JsonTextReader // из библиотеки public JsonReaderInternal(TextReader reader) : base(reader) { Finished = false; + SupportMultipleContent = true; + DateParseHandling = DateParseHandling.None; } public override bool Read() @@ -227,10 +229,7 @@ public void OpenFile(string JSONFileName, IValue encoding = null) throw new RuntimeException(e.Message, e); } - _reader = new JsonReaderInternal(_fileReader) - { - SupportMultipleContent = true - }; + _reader = new JsonReaderInternal(_fileReader); } /// @@ -252,10 +251,7 @@ public void OpenStream(IStreamWrapper streamContext, IValue encoding = null) var enc = encoding != null ? TextEncodingEnum.GetEncoding(encoding) : System.Text.Encoding.UTF8; - _reader = new JsonReaderInternal(new StreamReader(stream, enc, leaveOpen:true)) - { - SupportMultipleContent = true - }; + _reader = new JsonReaderInternal(new StreamReader(stream, enc, leaveOpen:true)); } /// @@ -295,10 +291,7 @@ public void SetString(string JSONString) { Close(); - _reader = new JsonReaderInternal(new StringReader(JSONString)) - { - SupportMultipleContent = true - }; + _reader = new JsonReaderInternal(new StringReader(JSONString)); } } diff --git a/tests/json/json-mock_isodate.json b/tests/json/json-mock_isodate.json new file mode 100644 index 000000000..9da105096 --- /dev/null +++ b/tests/json/json-mock_isodate.json @@ -0,0 +1 @@ +{ "lastSignInTime": "2026-05-13T22:51:46Z" } \ No newline at end of file diff --git a/tests/json/test-json_reader.os b/tests/json/test-json_reader.os index fdc3b5dc5..c5e58617b 100644 --- a/tests/json/test-json_reader.os +++ b/tests/json/test-json_reader.os @@ -28,6 +28,13 @@ СписокТестов.Добавить("Тест_Должен_ПроверитьОткрытиеПотока"); СписокТестов.Добавить("Тест_Должен_ПроверитьПовторноеОткрытиеПотока"); СписокТестов.Добавить("Тест_Должен_ПроверитьСохранениеПотокаПослеЗакрытияЧтения"); + + СписокТестов.Добавить("Тест_Должен_ОпределятьСтрокуСДатойВФорматеISOКакСтроку"); + СписокТестов.Добавить("Тест_Должен_ЧитатьСтрокуСДатойВФорматеISOКакСтроку"); + СписокТестов.Добавить("Тест_Должен_ОткрытьПотокЧитаетСтрокуСДатойВФорматеISOКакСтроку"); + СписокТестов.Добавить("Тест_Должен_ОткрытьФайлЧитаетСтрокуСДатойВФорматеISOКакСтроку"); + СписокТестов.Добавить("Тест_Должен_ЧитатьДатуВФорматеISOКакСтрокуПриИспользованииПрочитатьJSON"); + Возврат СписокТестов; КонецФункции @@ -256,3 +263,117 @@ юТест.ПроверитьРавенство(42, Json.Ответ); КонецПроцедуры + +Процедура Тест_Должен_ОпределятьСтрокуСДатойВФорматеISOКакСтроку() Экспорт + + // проверяемая строка json + СтрокаJSON = "{ ""lastSignInTime"": ""2026-05-13T22:51:46Z"" }"; + + // какие типы должны быть при последовательном чтении + ЭталонЗначения = Новый Массив; + ЭталонЗначения.Добавить( ТипЗначенияJSON.НачалоОбъекта ); + ЭталонЗначения.Добавить( ТипЗначенияJSON.ИмяСвойства ); + ЭталонЗначения.Добавить( ТипЗначенияJSON.Строка ); + ЭталонЗначения.Добавить( ТипЗначенияJSON.КонецОбъекта ); + + // читаем последовательно строку json и собираем типы значений по порядку + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(СтрокаJSON); + ФактЗначения = Новый Массив; + Пока ЧтениеJSON.Прочитать() Цикл + ФактЗначения.Добавить( ЧтениеJSON.ТипТекущегоЗначения ); + КонецЦикла; + ЧтениеJSON.Закрыть(); + + юТест.ПроверитьРавно( ЭталонЗначения.Количество(), ФактЗначения.Количество() ); + + Для Сч = 0 По ЭталонЗначения.ВГраница() Цикл + юТест.ПроверитьРавенство(ЭталонЗначения[Сч], ФактЗначения[Сч]); + КонецЦикла; + +КонецПроцедуры + +Процедура Тест_Должен_ЧитатьСтрокуСДатойВФорматеISOКакСтроку() Экспорт + + // проверяемая строка json + СтрокаJSON = "{ ""lastSignInTime"": ""2026-05-13T22:51:46Z"" }"; + + // читаем последовательно строку json и собираем типы значений по порядку + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(СтрокаJSON); + ЧтениеJSON.Прочитать(); // НачалоОбъекта + ЧтениеJSON.Прочитать(); // ИмяСвойства + ЧтениеJSON.Прочитать(); // Строка + + ТекущееЗначение = ЧтениеJSON.ТекущееЗначение; + ТекущийТип = ЧтениеJSON.ТипТекущегоЗначения; + + ЧтениеJSON.Закрыть(); + + юТест.ПроверитьРавенство(ТекущееЗначение, "2026-05-13T22:51:46Z"); + юТест.ПроверитьРавенство(ТекущийТип, ТипЗначенияJSON.Строка); + +КонецПроцедуры + +Процедура Тест_Должен_ЧитатьДатуВФорматеISOКакСтрокуПриИспользованииПрочитатьJSON() Экспорт + + // проверяемая строка json + СтрокаJSON = "{ ""lastSignInTime"": ""2026-05-13T22:51:46.230Z"" }"; + + // читаем json в структуру + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(СтрокаJSON); + Объект = ПрочитатьJSON(ЧтениеJSON); + ЧтениеJSON.Закрыть(); + + Ожидаем = Тип("Строка"); + Факт = ТипЗнч( Объект.lastSignInTime ); + юТест.ПроверитьРавенство(Ожидаем, Факт); + юТест.ПроверитьРавенство(Объект.lastSignInTime, "2026-05-13T22:51:46.230Z"); + +КонецПроцедуры + + +Процедура Тест_Должен_ОткрытьПотокЧитаетСтрокуСДатойВФорматеISOКакСтроку() Экспорт + + // проверяемая строка json + СтрокаJSON = "{ ""lastSignInTime"": ""2026-05-13T22:51:46Z"" }"; + + БДД = ПолучитьБуферДвоичныхДанныхИзСтроки(СтрокаJSON); + Поток = Новый ПотокВПамяти(БДД); + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.ОткрытьПоток(Поток); + + ЧтениеJSON.Прочитать(); // НачалоОбъекта + ЧтениеJSON.Прочитать(); // ИмяСвойства + ЧтениеJSON.Прочитать(); // Строка + + ТекущееЗначение = ЧтениеJSON.ТекущееЗначение; + ТипТекущегоЗначения = ЧтениеJSON.ТипТекущегоЗначения; + + ЧтениеJSON.Закрыть(); + + юТест.ПроверитьРавенство(ТекущееЗначение, "2026-05-13T22:51:46Z"); + юТест.ПроверитьРавенство(ТипТекущегоЗначения, ТипЗначенияJSON.Строка); + +КонецПроцедуры + +Процедура Тест_Должен_ОткрытьФайлЧитаетСтрокуСДатойВФорматеISOКакСтроку() Экспорт + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.ОткрытьФайл("json/json-mock_isodate.json"); + + ЧтениеJSON.Прочитать(); // НачалоОбъекта + ЧтениеJSON.Прочитать(); // ИмяСвойства + ЧтениеJSON.Прочитать(); // Строка + + ТекущееЗначение = ЧтениеJSON.ТекущееЗначение; + ТипТекущегоЗначения = ЧтениеJSON.ТипТекущегоЗначения; + + ЧтениеJSON.Закрыть(); + + юТест.ПроверитьРавенство(ТекущееЗначение, "2026-05-13T22:51:46Z"); + юТест.ПроверитьРавенство(ТипТекущегоЗначения, ТипЗначенияJSON.Строка); + +КонецПроцедуры