-
Notifications
You must be signed in to change notification settings - Fork 116
fix #1679: добавлен метод ОткрытьПоток() объекта ЧтениеJSON #1680
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Changes from all commits
777fac1
0297f46
0ca87f7
021d90f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -5,15 +5,16 @@ This Source Code Form is subject to the terms of the | |||||||||||||||||||||||||||||||||||||||
| at http://mozilla.org/MPL/2.0/. | ||||||||||||||||||||||||||||||||||||||||
| ----------------------------------------------------------*/ | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| using System; | ||||||||||||||||||||||||||||||||||||||||
| using System.IO; | ||||||||||||||||||||||||||||||||||||||||
| using Newtonsoft.Json; | ||||||||||||||||||||||||||||||||||||||||
| using OneScript.Commons; | ||||||||||||||||||||||||||||||||||||||||
| using OneScript.Contexts; | ||||||||||||||||||||||||||||||||||||||||
| using OneScript.Exceptions; | ||||||||||||||||||||||||||||||||||||||||
| using OneScript.StandardLibrary.Binary; | ||||||||||||||||||||||||||||||||||||||||
| using OneScript.StandardLibrary.Text; | ||||||||||||||||||||||||||||||||||||||||
| using ScriptEngine.Machine; | ||||||||||||||||||||||||||||||||||||||||
| using ScriptEngine.Machine.Contexts; | ||||||||||||||||||||||||||||||||||||||||
| using System; | ||||||||||||||||||||||||||||||||||||||||
| using System.IO; | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| namespace OneScript.StandardLibrary.Json | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
|
|
@@ -40,7 +41,6 @@ public override bool Read() | |||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| /// <summary> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| /// Предназначен для последовательного чтения JSON-данных из файла или строки. | ||||||||||||||||||||||||||||||||||||||||
| /// </summary> | ||||||||||||||||||||||||||||||||||||||||
| [ContextClass("ЧтениеJSON", "JSONReader")] | ||||||||||||||||||||||||||||||||||||||||
|
|
@@ -50,7 +50,6 @@ public class JSONReader : AutoContext<JSONReader> | |||||||||||||||||||||||||||||||||||||||
| private JsonReaderInternal _reader; | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| /// <summary> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| /// Возвращает true если для объекта чтения json был задан текст для парсинга. | ||||||||||||||||||||||||||||||||||||||||
| /// </summary> | ||||||||||||||||||||||||||||||||||||||||
| private bool IsOpen() => _reader != null; | ||||||||||||||||||||||||||||||||||||||||
|
|
@@ -71,49 +70,25 @@ public static JSONReader Constructor() | |||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| /// <summary> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| /// Указывает на позицию, находящуюся сразу после прочитанного значения. | ||||||||||||||||||||||||||||||||||||||||
| /// При ошибке чтение остается на позиции последнего успешно считанного символа. | ||||||||||||||||||||||||||||||||||||||||
| /// </summary> | ||||||||||||||||||||||||||||||||||||||||
| /// <value>Число (Number), Неопределено (Undefined)</value> | ||||||||||||||||||||||||||||||||||||||||
| [ContextProperty("ТекущаяПозиция", "CurrentPosition")] | ||||||||||||||||||||||||||||||||||||||||
| public IValue CurrentPosition | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
| get | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
| if (IsOpen()) | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
| return ValueFactory.Create(_reader.LinePosition); | ||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| return ValueFactory.Create(); // Неопределено | ||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
| => IsOpen() ? ValueFactory.Create(_reader.LinePosition) : ValueFactory.Create(); | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| /// <summary> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| /// Указывает на позицию сразу после прочитанного значения. | ||||||||||||||||||||||||||||||||||||||||
| /// Например, перед чтением первого элемента - 0, после чтения первого элемента -1 . | ||||||||||||||||||||||||||||||||||||||||
| /// </summary> | ||||||||||||||||||||||||||||||||||||||||
| /// <value>Число (Number), Неопределено (Undefined)</value> | ||||||||||||||||||||||||||||||||||||||||
| [ContextProperty("ТекущаяСтрока", "CurrentLine")] | ||||||||||||||||||||||||||||||||||||||||
| public IValue CurrentLine | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
| get | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
| if (IsOpen()) | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
| return ValueFactory.Create(_reader.LineNumber); | ||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| return ValueFactory.Create(); // Неопределено | ||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
| => IsOpen() ? ValueFactory.Create(_reader.LineNumber) : ValueFactory.Create(); | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| /// <summary> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| /// Содержит текущее значение: | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| /// - Число - если ТипТекущегоЗначения имеет значение Число; | ||||||||||||||||||||||||||||||||||||||||
| /// - Строка - если ТипТекущегоЗначения имеет одно из следующих значений: | ||||||||||||||||||||||||||||||||||||||||
| /// - Комментарий, | ||||||||||||||||||||||||||||||||||||||||
|
|
@@ -160,15 +135,13 @@ public IValue CurrentValue | |||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| default: | ||||||||||||||||||||||||||||||||||||||||
| throw JSONReaderException.CannotGetValue(); | ||||||||||||||||||||||||||||||||||||||||
| ; | ||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| public object ReaderValue => _reader.Value; | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| /// <summary> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| /// Тип текущего значения в документе JSON во внутреннем формате. | ||||||||||||||||||||||||||||||||||||||||
| /// null - если чтение еще не началось или достигнут конец файла. | ||||||||||||||||||||||||||||||||||||||||
| /// </summary> | ||||||||||||||||||||||||||||||||||||||||
|
|
@@ -183,7 +156,6 @@ public JsonToken CurrentJsonTokenType | |||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| /// <summary> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| /// Тип текущего значения в документе JSON. | ||||||||||||||||||||||||||||||||||||||||
| /// Неопределено - если чтение еще не началось или достигнут конец файла. | ||||||||||||||||||||||||||||||||||||||||
| /// </summary> | ||||||||||||||||||||||||||||||||||||||||
|
|
@@ -217,10 +189,8 @@ public JSONValueTypeEnum CurrentValueType | |||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| /// <summary> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| /// Завершает чтение текста JSON из файла или строки. | ||||||||||||||||||||||||||||||||||||||||
| /// </summary> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| [ContextMethod("Закрыть", "Close")] | ||||||||||||||||||||||||||||||||||||||||
| public void Close() | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
|
|
@@ -232,28 +202,25 @@ public void Close() | |||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| /// <summary> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| /// Открывает JSON-файл для чтения данным объектом. Если перед вызовом данного метода уже производилось чтение JSON из другого файла или строки, то чтение прекращается и объект инициализируется для чтения из указанного файла. | ||||||||||||||||||||||||||||||||||||||||
| /// Открывает JSON-файл для чтения данным объектом. | ||||||||||||||||||||||||||||||||||||||||
| /// Если перед вызовом данного метода уже производилось чтение JSON из другого файла или строки, | ||||||||||||||||||||||||||||||||||||||||
| /// то чтение прекращается и объект инициализируется для чтения из указанного файла. | ||||||||||||||||||||||||||||||||||||||||
| /// </summary> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| /// <param name="JSONFileName"> | ||||||||||||||||||||||||||||||||||||||||
| /// Имя файла, содержащего текст JSON. </param> | ||||||||||||||||||||||||||||||||||||||||
| /// <param name="encoding"> | ||||||||||||||||||||||||||||||||||||||||
| /// Позволяет задать кодировку входного файла.</param> | ||||||||||||||||||||||||||||||||||||||||
| [ContextMethod("ОткрытьФайл", "OpenFile")] | ||||||||||||||||||||||||||||||||||||||||
| public void OpenFile(string JSONFileName, IValue encoding = null) | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
| if (IsOpen()) | ||||||||||||||||||||||||||||||||||||||||
| Close(); | ||||||||||||||||||||||||||||||||||||||||
| Close(); | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| StreamReader _fileReader; | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| try | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
| if (encoding != null) | ||||||||||||||||||||||||||||||||||||||||
| _fileReader = FileOpener.OpenReader(JSONFileName, TextEncodingEnum.GetEncoding(encoding)); | ||||||||||||||||||||||||||||||||||||||||
| else | ||||||||||||||||||||||||||||||||||||||||
| _fileReader = FileOpener.OpenReader(JSONFileName, System.Text.Encoding.UTF8); | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
| var enc = encoding != null ? TextEncodingEnum.GetEncoding(encoding) : System.Text.Encoding.UTF8; | ||||||||||||||||||||||||||||||||||||||||
| _fileReader = FileOpener.OpenReader(JSONFileName, enc); | ||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
| catch (Exception e) | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
|
|
@@ -266,11 +233,35 @@ public void OpenFile(string JSONFileName, IValue encoding = null) | |||||||||||||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| /// <summary> | ||||||||||||||||||||||||||||||||||||||||
| /// Устанавливает поток для чтения JSON данным объектом. | ||||||||||||||||||||||||||||||||||||||||
| /// Если перед вызовом данного метода уже производилось чтение JSON из другого файла, строки или потока, | ||||||||||||||||||||||||||||||||||||||||
| /// то чтение прекращается и объект инициализируется для чтения из указанного потока. | ||||||||||||||||||||||||||||||||||||||||
| /// </summary> | ||||||||||||||||||||||||||||||||||||||||
| /// <param name="streamContext"> | ||||||||||||||||||||||||||||||||||||||||
| /// Поток для чтения текста JSON.</param> | ||||||||||||||||||||||||||||||||||||||||
| /// <param name="encoding"> | ||||||||||||||||||||||||||||||||||||||||
| /// Позволяет задать кодировку входного потока.</param> | ||||||||||||||||||||||||||||||||||||||||
| [ContextMethod("ОткрытьПоток", "OpenStream")] | ||||||||||||||||||||||||||||||||||||||||
| public void OpenStream(IStreamWrapper streamContext, IValue encoding = null) | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
| Close(); | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| var stream = streamContext?.GetUnderlyingStream() | ||||||||||||||||||||||||||||||||||||||||
| ?? throw new ArgumentNullException(nameof(streamContext)); | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| var enc = encoding != null ? TextEncodingEnum.GetEncoding(encoding) : System.Text.Encoding.UTF8; | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| _reader = new JsonReaderInternal(new StreamReader(stream, enc, leaveOpen:true)) | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
| SupportMultipleContent = true | ||||||||||||||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+253
to
+258
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Align
Proposed fix- var enc = encoding != null ? TextEncodingEnum.GetEncoding(encoding) : System.Text.Encoding.UTF8;
-
- _reader = new JsonReaderInternal(new StreamReader(stream, enc, leaveOpen:true))
- {
- SupportMultipleContent = true
- };
+ try
+ {
+ var enc = encoding != null ? TextEncodingEnum.GetEncoding(encoding) : System.Text.Encoding.UTF8;
+
+ _reader = new JsonReaderInternal(new StreamReader(stream, enc, leaveOpen: true))
+ {
+ SupportMultipleContent = true
+ };
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e.Message, e);
+ }📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| /// <summary> | ||||||||||||||||||||||||||||||||||||||||
| /// Если текущее значение – начало массива или объекта, то пропускает его содержимое и конец. | ||||||||||||||||||||||||||||||||||||||||
| /// Для остальных типов значений работает аналогично методу Прочитать(). | ||||||||||||||||||||||||||||||||||||||||
| /// </summary> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| [ContextMethod("Пропустить", "Skip")] | ||||||||||||||||||||||||||||||||||||||||
| public bool Skip() | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
|
|
@@ -287,29 +278,22 @@ public bool Skip() | |||||||||||||||||||||||||||||||||||||||
| /// <summary> | ||||||||||||||||||||||||||||||||||||||||
| /// Выполняет чтение значения JSON. | ||||||||||||||||||||||||||||||||||||||||
| /// </summary> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| [ContextMethod("Прочитать", "Read")] | ||||||||||||||||||||||||||||||||||||||||
| public bool Read() | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
| CheckIfOpen(); | ||||||||||||||||||||||||||||||||||||||||
| return _reader.Read(); | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| /// <summary> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| /// Устанавливает строку, содержащую текст JSON для чтения данным объектом. Если перед вызовом данного метода уже производилось чтение JSON из другого файла или строки, то чтение прекращается и объект инициализируется для чтения из указанной строки. | ||||||||||||||||||||||||||||||||||||||||
| /// </summary> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| /// <param name="JSONString"> | ||||||||||||||||||||||||||||||||||||||||
| /// Строка, содержащая текст в формате JSON. </param> | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||
| [ContextMethod("УстановитьСтроку", "SetString")] | ||||||||||||||||||||||||||||||||||||||||
| public void SetString(string JSONString) | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
| if (IsOpen()) | ||||||||||||||||||||||||||||||||||||||||
| Close(); | ||||||||||||||||||||||||||||||||||||||||
| Close(); | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| _reader = new JsonReaderInternal(new StringReader(JSONString)) | ||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add explicit null guards for concrete string inputs.
OpenFileandSetStringacceptstringparameters but don’t explicitly handlenull. Direct C# calls can still passnull, and failures then happen deeper with less clear diagnostics.Proposed fix
public void OpenFile(string JSONFileName, IValue encoding = null) { + if (JSONFileName == null) + throw new ArgumentNullException(nameof(JSONFileName)); + Close(); StreamReader _fileReader;public void SetString(string JSONString) { + if (JSONString == null) + throw new ArgumentNullException(nameof(JSONString)); + Close(); _reader = new JsonReaderInternal(new StringReader(JSONString))Based on learnings: when script-side calls omit concrete string arguments they may become
"", while direct calls may passnull, so public methods should explicitly handlenull.Also applies to: 294-297
🤖 Prompt for AI Agents