Skip to content

Commit 777fac1

Browse files
committed
fix EvilBeaver#1679: добавлен метод ОткрытьПоток() объекта ЧтениеJSON
1 parent a541e3e commit 777fac1

2 files changed

Lines changed: 47 additions & 2 deletions

File tree

src/OneScript.StandardLibrary/Json/JSONReader.cs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@ This Source Code Form is subject to the terms of the
55
at http://mozilla.org/MPL/2.0/.
66
----------------------------------------------------------*/
77

8-
using System;
9-
using System.IO;
108
using Newtonsoft.Json;
119
using OneScript.Commons;
1210
using OneScript.Contexts;
1311
using OneScript.Exceptions;
12+
using OneScript.StandardLibrary.Binary;
1413
using OneScript.StandardLibrary.Text;
1514
using ScriptEngine.Machine;
1615
using ScriptEngine.Machine.Contexts;
16+
using System;
17+
using System.IO;
1718

1819
namespace OneScript.StandardLibrary.Json
1920
{
@@ -266,6 +267,38 @@ public void OpenFile(string JSONFileName, IValue encoding = null)
266267
};
267268
}
268269

270+
/// <summary>
271+
/// Устанавливает поток для чтения JSON данным объектом.
272+
/// Если перед вызовом данного метода уже производилось чтение JSON из другого файла, строки или потока,
273+
/// то чтение прекращается и объект инициализируется для чтения из указанного потока.
274+
/// </summary>
275+
/// <param name="stream">
276+
/// Поток для чтения текста JSON.</param>
277+
/// <param name="encoding">
278+
/// Позволяет задать кодировку входного потока.</param>
279+
[ContextMethod("ОткрытьПоток", "OpenStream")]
280+
public void OpenStream(IValue streamContext, IValue encoding = null)
281+
{
282+
if (IsOpen())
283+
Close();
284+
285+
var stream = streamContext switch
286+
{
287+
GenericStream s => s.GetUnderlyingStream(),
288+
FileStreamContext s => s.GetUnderlyingStream(),
289+
MemoryStreamContext s => s.GetUnderlyingStream(),
290+
291+
_ => throw RuntimeException.InvalidNthArgumentType(1)
292+
};
293+
294+
var enc = encoding != null ? TextEncodingEnum.GetEncoding(encoding) : System.Text.Encoding.UTF8;
295+
296+
_reader = new JsonReaderInternal(new StreamReader(stream, enc))
297+
{
298+
SupportMultipleContent = true
299+
};
300+
}
301+
269302
/// <summary>
270303
/// Если текущее значение – начало массива или объекта, то пропускает его содержимое и конец.
271304
/// Для остальных типов значений работает аналогично методу Прочитать().

tests/json/test-json_reader.os

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
СписокТестов.Добавить("Тест_Должен_ПроверитьПропускНезавершенногоМассива");
2525
СписокТестов.Добавить("Тест_Должен_ПроверитьПропускМассиваСВложенными");
2626
СписокТестов.Добавить("Тест_Должен_ПроверитьПропускОбъектаСВложениями");
27+
28+
СписокТестов.Добавить("Тест_Должен_ПроверитьОткрытиеПотока");
2729
Возврат СписокТестов;
2830

2931
КонецФункции
@@ -219,3 +221,13 @@
219221
юТест.ПроверитьРавенство(ТипЗначенияJSON.Число, Чтение.ТипТекущегоЗначения);
220222
юТест.ПроверитьРавенство(5, Чтение.ТекущееЗначение);
221223
КонецПроцедуры
224+
225+
Процедура Тест_Должен_ПроверитьОткрытиеПотока() Экспорт
226+
БДД = ПолучитьБуферДвоичныхДанныхИзСтроки("{""ответ"":42}");
227+
Поток = Новый ПотокВПамяти(БДД);
228+
Чтение = Новый ЧтениеJSON;
229+
Чтение.ОткрытьПоток(Поток);
230+
Json = ПрочитатьJSON(Чтение);
231+
232+
юТест.ПроверитьРавенство(42, Json.Ответ);
233+
КонецПроцедуры

0 commit comments

Comments
 (0)