Skip to content

Commit 4ade77d

Browse files
authored
Merge pull request #1682 from leemuar/fix-readerjson-date-parsing
Исправлена ошибка при чтении строк, содержащих дату в формате ISO 8601, при использовании объекта ЧтениеJSON и глобальной функции ПрочитатьJSON: строки с датой больше не преобразуются в Дату автоматически
2 parents d201b54 + 23221a1 commit 4ade77d

3 files changed

Lines changed: 129 additions & 14 deletions

File tree

src/OneScript.StandardLibrary/Json/JSONReader.cs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ internal class JsonReaderInternal: JsonTextReader // из библиотеки
2323
public JsonReaderInternal(TextReader reader) : base(reader)
2424
{
2525
Finished = false;
26+
SupportMultipleContent = true;
27+
DateParseHandling = DateParseHandling.None;
2628
}
2729

2830
public override bool Read()
@@ -227,10 +229,7 @@ public void OpenFile(string JSONFileName, IValue encoding = null)
227229
throw new RuntimeException(e.Message, e);
228230
}
229231

230-
_reader = new JsonReaderInternal(_fileReader)
231-
{
232-
SupportMultipleContent = true
233-
};
232+
_reader = new JsonReaderInternal(_fileReader);
234233
}
235234

236235
/// <summary>
@@ -252,10 +251,7 @@ public void OpenStream(IStreamWrapper streamContext, IValue encoding = null)
252251

253252
var enc = encoding != null ? TextEncodingEnum.GetEncoding(encoding) : System.Text.Encoding.UTF8;
254253

255-
_reader = new JsonReaderInternal(new StreamReader(stream, enc, leaveOpen:true))
256-
{
257-
SupportMultipleContent = true
258-
};
254+
_reader = new JsonReaderInternal(new StreamReader(stream, enc, leaveOpen:true));
259255
}
260256

261257
/// <summary>
@@ -295,10 +291,7 @@ public void SetString(string JSONString)
295291
{
296292
Close();
297293

298-
_reader = new JsonReaderInternal(new StringReader(JSONString))
299-
{
300-
SupportMultipleContent = true
301-
};
294+
_reader = new JsonReaderInternal(new StringReader(JSONString));
302295
}
303296

304297
}

tests/json/json-mock_isodate.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{ "lastSignInTime": "2026-05-13T22:51:46Z" }

tests/json/test-json_reader.os

Lines changed: 123 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@
2828
СписокТестов.Добавить("Тест_Должен_ПроверитьОткрытиеПотока");
2929
СписокТестов.Добавить("Тест_Должен_ПроверитьПовторноеОткрытиеПотока");
3030
СписокТестов.Добавить("Тест_Должен_ПроверитьСохранениеПотокаПослеЗакрытияЧтения");
31+
32+
СписокТестов.Добавить("Тест_Должен_ОпределятьСтрокуСДатойВФорматеISOКакСтроку");
33+
СписокТестов.Добавить("Тест_Должен_ЧитатьСтрокуСДатойВФорматеISOКакСтроку");
34+
СписокТестов.Добавить("Тест_Должен_ОткрытьПотокЧитаетСтрокуСДатойВФорматеISOКакСтроку");
35+
СписокТестов.Добавить("Тест_Должен_ОткрытьФайлЧитаетСтрокуСДатойВФорматеISOКакСтроку");
36+
СписокТестов.Добавить("Тест_Должен_ЧитатьДатуВФорматеISOКакСтрокуПриИспользованииПрочитатьJSON");
37+
3138
Возврат СписокТестов;
3239

3340
КонецФункции
@@ -69,15 +76,15 @@
6976

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

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

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

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

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

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

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

@@ -256,3 +263,117 @@
256263

257264
юТест.ПроверитьРавенство(42, Json.Ответ);
258265
КонецПроцедуры
266+
267+
Процедура Тест_Должен_ОпределятьСтрокуСДатойВФорматеISOКакСтроку() Экспорт
268+
269+
// проверяемая строка json
270+
СтрокаJSON = "{ ""lastSignInTime"": ""2026-05-13T22:51:46Z"" }";
271+
272+
// какие типы должны быть при последовательном чтении
273+
ЭталонЗначения = Новый Массив;
274+
ЭталонЗначения.Добавить( ТипЗначенияJSON.НачалоОбъекта );
275+
ЭталонЗначения.Добавить( ТипЗначенияJSON.ИмяСвойства );
276+
ЭталонЗначения.Добавить( ТипЗначенияJSON.Строка );
277+
ЭталонЗначения.Добавить( ТипЗначенияJSON.КонецОбъекта );
278+
279+
// читаем последовательно строку json и собираем типы значений по порядку
280+
ЧтениеJSON = Новый ЧтениеJSON;
281+
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
282+
ФактЗначения = Новый Массив;
283+
Пока ЧтениеJSON.Прочитать() Цикл
284+
ФактЗначения.Добавить( ЧтениеJSON.ТипТекущегоЗначения );
285+
КонецЦикла;
286+
ЧтениеJSON.Закрыть();
287+
288+
юТест.ПроверитьРавенство( ЭталонЗначения.Количество(), ФактЗначения.Количество() );
289+
290+
Для Сч = 0 По ЭталонЗначения.ВГраница() Цикл
291+
юТест.ПроверитьРавенство(ЭталонЗначения[Сч], ФактЗначения[Сч]);
292+
КонецЦикла;
293+
294+
КонецПроцедуры
295+
296+
Процедура Тест_Должен_ЧитатьСтрокуСДатойВФорматеISOКакСтроку() Экспорт
297+
298+
// проверяемая строка json
299+
СтрокаJSON = "{ ""lastSignInTime"": ""2026-05-13T22:51:46Z"" }";
300+
301+
// читаем последовательно строку json и собираем типы значений по порядку
302+
ЧтениеJSON = Новый ЧтениеJSON;
303+
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
304+
ЧтениеJSON.Прочитать(); // НачалоОбъекта
305+
ЧтениеJSON.Прочитать(); // ИмяСвойства
306+
ЧтениеJSON.Прочитать(); // Строка
307+
308+
ТекущееЗначение = ЧтениеJSON.ТекущееЗначение;
309+
ТекущийТип = ЧтениеJSON.ТипТекущегоЗначения;
310+
311+
ЧтениеJSON.Закрыть();
312+
313+
юТест.ПроверитьРавенство(ТекущееЗначение, "2026-05-13T22:51:46Z");
314+
юТест.ПроверитьРавенство(ТекущийТип, ТипЗначенияJSON.Строка);
315+
316+
КонецПроцедуры
317+
318+
Процедура Тест_Должен_ЧитатьДатуВФорматеISOКакСтрокуПриИспользованииПрочитатьJSON() Экспорт
319+
320+
// проверяемая строка json
321+
СтрокаJSON = "{ ""lastSignInTime"": ""2026-05-13T22:51:46.230Z"" }";
322+
323+
// читаем json в структуру
324+
ЧтениеJSON = Новый ЧтениеJSON;
325+
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
326+
Объект = ПрочитатьJSON(ЧтениеJSON);
327+
ЧтениеJSON.Закрыть();
328+
329+
Эталон = Тип("Строка");
330+
Факт = ТипЗнч( Объект.lastSignInTime );
331+
юТест.ПроверитьРавенство(Эталон, Факт);
332+
юТест.ПроверитьРавенство(Объект.lastSignInTime, "2026-05-13T22:51:46.230Z");
333+
334+
КонецПроцедуры
335+
336+
337+
Процедура Тест_Должен_ОткрытьПотокЧитаетСтрокуСДатойВФорматеISOКакСтроку() Экспорт
338+
339+
// проверяемая строка json
340+
СтрокаJSON = "{ ""lastSignInTime"": ""2026-05-13T22:51:46Z"" }";
341+
342+
БДД = ПолучитьБуферДвоичныхДанныхИзСтроки(СтрокаJSON);
343+
Поток = Новый ПотокВПамяти(БДД);
344+
345+
ЧтениеJSON = Новый ЧтениеJSON;
346+
ЧтениеJSON.ОткрытьПоток(Поток);
347+
348+
ЧтениеJSON.Прочитать(); // НачалоОбъекта
349+
ЧтениеJSON.Прочитать(); // ИмяСвойства
350+
ЧтениеJSON.Прочитать(); // Строка
351+
352+
ТекущееЗначение = ЧтениеJSON.ТекущееЗначение;
353+
ТипТекущегоЗначения = ЧтениеJSON.ТипТекущегоЗначения;
354+
355+
ЧтениеJSON.Закрыть();
356+
357+
юТест.ПроверитьРавенство(ТекущееЗначение, "2026-05-13T22:51:46Z");
358+
юТест.ПроверитьРавенство(ТипТекущегоЗначения, ТипЗначенияJSON.Строка);
359+
360+
КонецПроцедуры
361+
362+
Процедура Тест_Должен_ОткрытьФайлЧитаетСтрокуСДатойВФорматеISOКакСтроку() Экспорт
363+
364+
ЧтениеJSON = Новый ЧтениеJSON;
365+
ЧтениеJSON.ОткрытьФайл("json/json-mock_isodate.json");
366+
367+
ЧтениеJSON.Прочитать(); // НачалоОбъекта
368+
ЧтениеJSON.Прочитать(); // ИмяСвойства
369+
ЧтениеJSON.Прочитать(); // Строка
370+
371+
ТекущееЗначение = ЧтениеJSON.ТекущееЗначение;
372+
ТипТекущегоЗначения = ЧтениеJSON.ТипТекущегоЗначения;
373+
374+
ЧтениеJSON.Закрыть();
375+
376+
юТест.ПроверитьРавенство(ТекущееЗначение, "2026-05-13T22:51:46Z");
377+
юТест.ПроверитьРавенство(ТипТекущегоЗначения, ТипЗначенияJSON.Строка);
378+
379+
КонецПроцедуры

0 commit comments

Comments
 (0)