Skip to content

Commit 021d90f

Browse files
committed
null-safety; some cleanup; fix test
1 parent 0ca87f7 commit 021d90f

2 files changed

Lines changed: 12 additions & 49 deletions

File tree

src/OneScript.StandardLibrary/Json/JSONReader.cs

Lines changed: 11 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ public override bool Read()
4141
}
4242

4343
/// <summary>
44-
///
4544
/// Предназначен для последовательного чтения JSON-данных из файла или строки.
4645
/// </summary>
4746
[ContextClass("ЧтениеJSON", "JSONReader")]
@@ -51,7 +50,6 @@ public class JSONReader : AutoContext<JSONReader>
5150
private JsonReaderInternal _reader;
5251

5352
/// <summary>
54-
///
5553
/// Возвращает true если для объекта чтения json был задан текст для парсинга.
5654
/// </summary>
5755
private bool IsOpen() => _reader != null;
@@ -72,49 +70,25 @@ public static JSONReader Constructor()
7270
}
7371

7472
/// <summary>
75-
///
7673
/// Указывает на позицию, находящуюся сразу после прочитанного значения.
7774
/// При ошибке чтение остается на позиции последнего успешно считанного символа.
7875
/// </summary>
7976
/// <value>Число (Number), Неопределено (Undefined)</value>
8077
[ContextProperty("ТекущаяПозиция", "CurrentPosition")]
8178
public IValue CurrentPosition
82-
{
83-
get
84-
{
85-
if (IsOpen())
86-
{
87-
return ValueFactory.Create(_reader.LinePosition);
88-
}
89-
90-
return ValueFactory.Create(); // Неопределено
91-
}
92-
}
79+
=> IsOpen() ? ValueFactory.Create(_reader.LinePosition) : ValueFactory.Create();
9380

9481
/// <summary>
95-
///
9682
/// Указывает на позицию сразу после прочитанного значения.
9783
/// Например, перед чтением первого элемента - 0, после чтения первого элемента -1 .
9884
/// </summary>
9985
/// <value>Число (Number), Неопределено (Undefined)</value>
10086
[ContextProperty("ТекущаяСтрока", "CurrentLine")]
10187
public IValue CurrentLine
102-
{
103-
get
104-
{
105-
if (IsOpen())
106-
{
107-
return ValueFactory.Create(_reader.LineNumber);
108-
}
109-
110-
return ValueFactory.Create(); // Неопределено
111-
}
112-
}
88+
=> IsOpen() ? ValueFactory.Create(_reader.LineNumber) : ValueFactory.Create();
11389

11490
/// <summary>
115-
///
11691
/// Содержит текущее значение:
117-
///
11892
/// - Число - если ТипТекущегоЗначения имеет значение Число;
11993
/// - Строка - если ТипТекущегоЗначения имеет одно из следующих значений:
12094
/// - Комментарий,
@@ -161,15 +135,13 @@ public IValue CurrentValue
161135

162136
default:
163137
throw JSONReaderException.CannotGetValue();
164-
;
165138
}
166139
}
167140
}
168141

169142
public object ReaderValue => _reader.Value;
170143

171144
/// <summary>
172-
///
173145
/// Тип текущего значения в документе JSON во внутреннем формате.
174146
/// null - если чтение еще не началось или достигнут конец файла.
175147
/// </summary>
@@ -184,7 +156,6 @@ public JsonToken CurrentJsonTokenType
184156
}
185157

186158
/// <summary>
187-
///
188159
/// Тип текущего значения в документе JSON.
189160
/// Неопределено - если чтение еще не началось или достигнут конец файла.
190161
/// </summary>
@@ -218,10 +189,8 @@ public JSONValueTypeEnum CurrentValueType
218189
}
219190

220191
/// <summary>
221-
///
222192
/// Завершает чтение текста JSON из файла или строки.
223193
/// </summary>
224-
///
225194
[ContextMethod("Закрыть", "Close")]
226195
public void Close()
227196
{
@@ -233,10 +202,10 @@ public void Close()
233202
}
234203

235204
/// <summary>
236-
///
237-
/// Открывает JSON-файл для чтения данным объектом. Если перед вызовом данного метода уже производилось чтение JSON из другого файла или строки, то чтение прекращается и объект инициализируется для чтения из указанного файла.
205+
/// Открывает JSON-файл для чтения данным объектом.
206+
/// Если перед вызовом данного метода уже производилось чтение JSON из другого файла или строки,
207+
/// то чтение прекращается и объект инициализируется для чтения из указанного файла.
238208
/// </summary>
239-
///
240209
/// <param name="JSONFileName">
241210
/// Имя файла, содержащего текст JSON. </param>
242211
/// <param name="encoding">
@@ -249,11 +218,9 @@ public void OpenFile(string JSONFileName, IValue encoding = null)
249218
StreamReader _fileReader;
250219

251220
try
252-
{
253-
if (encoding != null)
254-
_fileReader = FileOpener.OpenReader(JSONFileName, TextEncodingEnum.GetEncoding(encoding));
255-
else
256-
_fileReader = FileOpener.OpenReader(JSONFileName, System.Text.Encoding.UTF8);
221+
{
222+
var enc = encoding != null ? TextEncodingEnum.GetEncoding(encoding) : System.Text.Encoding.UTF8;
223+
_fileReader = FileOpener.OpenReader(JSONFileName, enc);
257224
}
258225
catch (Exception e)
259226
{
@@ -280,7 +247,9 @@ public void OpenStream(IStreamWrapper streamContext, IValue encoding = null)
280247
{
281248
Close();
282249

283-
var stream = streamContext.GetUnderlyingStream();
250+
var stream = streamContext?.GetUnderlyingStream()
251+
?? throw new ArgumentNullException(nameof(streamContext));
252+
284253
var enc = encoding != null ? TextEncodingEnum.GetEncoding(encoding) : System.Text.Encoding.UTF8;
285254

286255
_reader = new JsonReaderInternal(new StreamReader(stream, enc, leaveOpen:true))
@@ -293,7 +262,6 @@ public void OpenStream(IStreamWrapper streamContext, IValue encoding = null)
293262
/// Если текущее значение – начало массива или объекта, то пропускает его содержимое и конец.
294263
/// Для остальных типов значений работает аналогично методу Прочитать().
295264
/// </summary>
296-
///
297265
[ContextMethod("Пропустить", "Skip")]
298266
public bool Skip()
299267
{
@@ -310,24 +278,18 @@ public bool Skip()
310278
/// <summary>
311279
/// Выполняет чтение значения JSON.
312280
/// </summary>
313-
///
314281
[ContextMethod("Прочитать", "Read")]
315282
public bool Read()
316283
{
317284
CheckIfOpen();
318285
return _reader.Read();
319-
320286
}
321287

322288
/// <summary>
323-
///
324289
/// Устанавливает строку, содержащую текст JSON для чтения данным объектом. Если перед вызовом данного метода уже производилось чтение JSON из другого файла или строки, то чтение прекращается и объект инициализируется для чтения из указанной строки.
325290
/// </summary>
326-
///
327291
/// <param name="JSONString">
328292
/// Строка, содержащая текст в формате JSON. </param>
329-
///
330-
///
331293
[ContextMethod("УстановитьСтроку", "SetString")]
332294
public void SetString(string JSONString)
333295
{

tests/json/test-json_reader.os

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@
249249
БДД = ПолучитьБуферДвоичныхДанныхИзСтроки("{""ответ"":42}");
250250
Поток = Новый ПотокВПамяти(БДД);
251251
Чтение = Новый ЧтениеJSON;
252+
Чтение.ОткрытьПоток(Поток);
252253
Чтение.Закрыть();
253254
Чтение.ОткрытьПоток(Поток); // Поток должен остаться открытым
254255
Json = ПрочитатьJSON(Чтение);

0 commit comments

Comments
 (0)