Exemplo n.º 1
0
                /// <summary>
                /// Parses out a JSON array AST node with a jsonTextReader.
                /// </summary>
                /// <param name="jsonTextReader">The reader to use as a lexer / tokenizer</param>
                /// <returns>JSON array AST node</returns>
                private static ArrayNode ParseArrayNode(IJsonTextReaderPrivateImplementation jsonTextReader)
                {
                    List <JsonTextNavigatorNode> items = new List <JsonTextNavigatorNode>();

                    ReadOnlyMemory <byte> bufferedArrayStartToken = jsonTextReader.GetBufferedJsonToken().Memory;

                    if (!MemoryMarshal.TryGetArray(bufferedArrayStartToken, out ArraySegment <byte> startArrayArraySegment))
                    {
                        throw new InvalidOperationException($"Failed to get {nameof(startArrayArraySegment)}.");
                    }

                    // consume the begin array token
                    jsonTextReader.Read();

                    while (jsonTextReader.CurrentTokenType != JsonTokenType.EndArray)
                    {
                        items.Add(Parser.ParseNode(jsonTextReader));
                    }

                    ReadOnlyMemory <byte> bufferedArrayEndToken = jsonTextReader.GetBufferedJsonToken().Memory;

                    if (!MemoryMarshal.TryGetArray(bufferedArrayEndToken, out ArraySegment <byte> endArrayArraySegment))
                    {
                        throw new InvalidOperationException($"Failed to get {nameof(endArrayArraySegment)}.");
                    }

                    // consume the end array token
                    jsonTextReader.Read();

                    ReadOnlyMemory <byte> bufferedRawArray = startArrayArraySegment.Array;

                    bufferedRawArray = bufferedRawArray.Slice(start: startArrayArraySegment.Offset, length: endArrayArraySegment.Offset - startArrayArraySegment.Offset + 1);

                    return(ArrayNode.Create(items, bufferedRawArray));
                }
Exemplo n.º 2
0
                private static BinaryNode ParseBinaryNode(IJsonTextReaderPrivateImplementation jsonTextReader)
                {
                    ReadOnlyMemory <byte> bufferedRawJsonToken = jsonTextReader.GetBufferedJsonToken().Memory;
                    BinaryNode            node = BinaryNode.Create(bufferedRawJsonToken);

                    // advance the reader forward.
                    jsonTextReader.Read();
                    return(node);
                }
Exemplo n.º 3
0
                /// <summary>
                /// Gets the root node of a JSON AST from a jsonTextReader.
                /// </summary>
                /// <param name="jsonTextReader">The reader to use as a lexer / tokenizer</param>
                /// <returns>The root node of a JSON AST from a jsonTextReader.</returns>
                public static JsonTextNavigatorNode Parse(IJsonTextReaderPrivateImplementation jsonTextReader)
                {
                    // Read past the json object not started state.
                    if (!jsonTextReader.Read())
                    {
                        throw new InvalidOperationException("Failed to read from reader");
                    }

                    JsonTextNavigatorNode rootNode = Parser.ParseNode(jsonTextReader);

                    // Make sure that we are at the end of the file.
                    if (jsonTextReader.Read())
                    {
                        throw new ArgumentException("Did not fully parse json");
                    }

                    return(rootNode);
                }
Exemplo n.º 4
0
                /// <summary>
                /// Parses out a JSON number AST node with a jsonTextReader.
                /// </summary>
                /// <param name="jsonTextReader">The reader to use as a lexer / tokenizer</param>
                /// <returns>JSON number AST node</returns>
                private static NumberNode ParseNumberNode(IJsonTextReaderPrivateImplementation jsonTextReader)
                {
                    ReadOnlyMemory <byte> bufferedRawJsonToken = jsonTextReader.GetBufferedJsonToken().Memory;
                    NumberNode            numberNode           = NumberNode.Create(bufferedRawJsonToken);

                    // consume the number from the reader
                    jsonTextReader.Read();

                    return(numberNode);
                }
Exemplo n.º 5
0
                /// <summary>
                /// Parses out a JSON string AST node with a jsonTextReader.
                /// </summary>
                /// <param name="jsonTextReader">The reader to use as a lexer / tokenizer</param>
                /// <returns>JSON string AST node</returns>
                private static StringNode ParseStringNode(IJsonTextReaderPrivateImplementation jsonTextReader)
                {
                    Utf8Memory bufferedStringValue = jsonTextReader.GetBufferedJsonToken();
                    StringNode stringNode          = StringNode.Create(bufferedStringValue);

                    // consume the string from the reader
                    jsonTextReader.Read();

                    return(stringNode);
                }
Exemplo n.º 6
0
                /// <summary>
                /// Parses out a JSON property AST node with a jsonTextReader.
                /// </summary>
                /// <param name="jsonTextReader">The reader to use as a lexer / tokenizer</param>
                /// <returns>JSON property AST node</returns>
                private static ObjectProperty ParsePropertyNode(IJsonTextReaderPrivateImplementation jsonTextReader)
                {
                    ReadOnlyMemory <byte> bufferedRawJsonToken = jsonTextReader.GetBufferedJsonToken().Memory;
                    FieldNameNode         fieldName            = FieldNameNode.Create(Utf8Memory.UnsafeCreateNoValidation(bufferedRawJsonToken));

                    // Consume the fieldname from the jsonreader
                    jsonTextReader.Read();

                    JsonTextNavigatorNode value = Parser.ParseNode(jsonTextReader);

                    return(new ObjectProperty(fieldName, value));
                }
Exemplo n.º 7
0
                /// <summary>
                /// Parses out a JSON object AST node with a jsonTextReader.
                /// </summary>
                /// <param name="jsonTextReader">The reader to use as a lexer / tokenizer</param>
                /// <returns>JSON object AST node</returns>
                private static ObjectNode ParseObjectNode(IJsonTextReaderPrivateImplementation jsonTextReader)
                {
                    List <ObjectProperty> properties = new List <ObjectProperty>();

                    ReadOnlyMemory <byte> bufferedObjectStartToken = jsonTextReader.GetBufferedJsonToken().Memory;

                    if (!MemoryMarshal.TryGetArray(bufferedObjectStartToken, out ArraySegment <byte> startObjectArraySegment))
                    {
                        throw new InvalidOperationException($"Failed to get {nameof(startObjectArraySegment)}.");
                    }

                    // consume the begin object token
                    jsonTextReader.Read();

                    while (jsonTextReader.CurrentTokenType != JsonTokenType.EndObject)
                    {
                        ObjectProperty property = Parser.ParsePropertyNode(jsonTextReader);
                        properties.Add(property);
                    }

                    ReadOnlyMemory <byte> bufferedObjectEndToken = jsonTextReader.GetBufferedJsonToken().Memory;

                    if (!MemoryMarshal.TryGetArray(bufferedObjectEndToken, out ArraySegment <byte> endObjectArraySegment))
                    {
                        throw new InvalidOperationException($"Failed to get {nameof(endObjectArraySegment)}.");
                    }

                    // consume the end object token
                    jsonTextReader.Read();

                    ReadOnlyMemory <byte> bufferedRawObject = startObjectArraySegment.Array;

                    bufferedRawObject = bufferedRawObject.Slice(start: startObjectArraySegment.Offset, length: endObjectArraySegment.Offset - startObjectArraySegment.Offset + 1);

                    return(ObjectNode.Create(properties, bufferedRawObject));
                }
Exemplo n.º 8
0
                private static FloatNode ParseFloatNode(
                    IJsonTextReaderPrivateImplementation jsonTextReader,
                    JsonTokenType jsonTokenType)
                {
                    ReadOnlyMemory <byte> bufferedRawJsonToken = jsonTextReader.GetBufferedJsonToken().Memory;
                    FloatNode             floatNode            = jsonTokenType switch
                    {
                        JsonTokenType.Float32 => Float32Node.Create(bufferedRawJsonToken),
                        JsonTokenType.Float64 => Float64Node.Create(bufferedRawJsonToken),
                        _ => throw new ArgumentException($"Unknown {nameof(JsonTokenType)}: {jsonTokenType}"),
                    };

                    // consume the float from the reader
                    jsonTextReader.Read();

                    return(floatNode);
                }
Exemplo n.º 9
0
                private static IntegerNode ParseIntegerNode(
                    IJsonTextReaderPrivateImplementation jsonTextReader,
                    JsonTokenType jsonTokenType)
                {
                    ReadOnlyMemory <byte> bufferedRawJsonToken = jsonTextReader.GetBufferedJsonToken().Memory;
                    IntegerNode           integerNode          = jsonTokenType switch
                    {
                        JsonTokenType.Int8 => Int8Node.Create(bufferedRawJsonToken),
                        JsonTokenType.Int16 => Int16Node.Create(bufferedRawJsonToken),
                        JsonTokenType.Int32 => Int32Node.Create(bufferedRawJsonToken),
                        JsonTokenType.Int64 => Int64Node.Create(bufferedRawJsonToken),
                        JsonTokenType.UInt32 => UInt32Node.Create(bufferedRawJsonToken),
                        _ => throw new ArgumentException($"Unknown {nameof(JsonTokenType)}: {jsonTokenType}"),
                    };

                    // consume the integer from the reader
                    jsonTextReader.Read();

                    return(integerNode);
                }