Skip to content
Draft
17 changes: 5 additions & 12 deletions src/OneScript.StandardLibrary/Json/JSONReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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);
}

/// <summary>
Expand All @@ -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));
}

/// <summary>
Expand Down Expand Up @@ -295,10 +291,7 @@ public void SetString(string JSONString)
{
Close();

_reader = new JsonReaderInternal(new StringReader(JSONString))
{
SupportMultipleContent = true
};
_reader = new JsonReaderInternal(new StringReader(JSONString));
}

}
Expand Down
1 change: 1 addition & 0 deletions tests/json/json-mock_isodate.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ "lastSignInTime": "2026-05-13T22:51:46Z" }
121 changes: 121 additions & 0 deletions tests/json/test-json_reader.os
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@
СписокТестов.Добавить("Тест_Должен_ПроверитьОткрытиеПотока");
СписокТестов.Добавить("Тест_Должен_ПроверитьПовторноеОткрытиеПотока");
СписокТестов.Добавить("Тест_Должен_ПроверитьСохранениеПотокаПослеЗакрытияЧтения");

СписокТестов.Добавить("Тест_Должен_ОпределятьСтрокуСДатойВФорматеISOКакСтроку");
СписокТестов.Добавить("Тест_Должен_ЧитатьСтрокуСДатойВФорматеISOКакСтроку");
СписокТестов.Добавить("Тест_Должен_ОткрытьПотокЧитаетСтрокуСДатойВФорматеISOКакСтроку");
СписокТестов.Добавить("Тест_Должен_ОткрытьФайлЧитаетСтрокуСДатойВФорматеISOКакСтроку");
СписокТестов.Добавить("Тест_Должен_ЧитатьДатуВФорматеISOКакСтрокуПриИспользованииПрочитатьJSON");

Возврат СписокТестов;

КонецФункции
Expand Down Expand Up @@ -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 По ЭталонЗначения.ВГраница() Цикл
юТест.ПроверитьРавенство(ЭталонЗначения[Сч], ФактЗначения[Сч]);
КонецЦикла;

КонецПроцедуры
Comment thread
coderabbitai[bot] marked this conversation as resolved.

Процедура Тест_Должен_ЧитатьСтрокуСДатойВФормате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.Строка);

КонецПроцедуры
Comment thread
coderabbitai[bot] marked this conversation as resolved.

Процедура Тест_Должен_ОткрытьФайлЧитаетСтрокуСДатойВФорматеISOКакСтроку() Экспорт

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл("json/json-mock_isodate.json");

ЧтениеJSON.Прочитать(); // НачалоОбъекта
ЧтениеJSON.Прочитать(); // ИмяСвойства
ЧтениеJSON.Прочитать(); // Строка

ТекущееЗначение = ЧтениеJSON.ТекущееЗначение;
ТипТекущегоЗначения = ЧтениеJSON.ТипТекущегоЗначения;

ЧтениеJSON.Закрыть();

юТест.ПроверитьРавенство(ТекущееЗначение, "2026-05-13T22:51:46Z");
юТест.ПроверитьРавенство(ТипТекущегоЗначения, ТипЗначенияJSON.Строка);

КонецПроцедуры
Comment thread
coderabbitai[bot] marked this conversation as resolved.