Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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" }
125 changes: 123 additions & 2 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 @@ -69,15 +76,15 @@

СтруктураДанных = ПолучитьСтруктуруДанных("json/json-mock.json", Истина);

юТест.ПроверитьРавенство(РассчитатьХешСумму(СтруктураДанных), 960829385);
юТест.ПроверитьРавенство(РассчитатьХешСумму(СтруктураДанных), 3868110149);

КонецПроцедуры

Процедура Тест_Должен_СверитьХешСуммуРезультатаПарсингаJSONВСтруктуру() Экспорт

СтруктураДанных = ПолучитьСтруктуруДанных("json/json-mock_struct.json", Ложь);

юТест.ПроверитьРавенство(РассчитатьХешСумму(СтруктураДанных), 2800700943);
юТест.ПроверитьРавенство(РассчитатьХешСумму(СтруктураДанных), 856251251);

КонецПроцедуры

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.