/// <inheritdoc /> public override Number64 GetNumber64Value(IJsonNavigatorNode node) { if (!(node is NumberNode numberNode)) { throw new ArgumentException($"{node} was not of type: {nameof(NumberNode)}."); } Number64 value = JsonTextParser.GetNumberValue(numberNode.BufferedToken.Span); return(value); }
/// <inheritdoc /> public override UtfAnyString GetStringValue() { if (this.TryGetBufferedStringValue(out Utf8Memory memory)) { return(Utf8String.UnsafeFromUtf8BytesNoValidation(memory.Memory)); } ReadOnlyMemory <byte> stringToken = this.jsonTextBuffer.GetBufferedRawJsonToken( this.token.Start, this.token.End); return(JsonTextParser.GetStringValue(Utf8Memory.UnsafeCreateNoValidation(stringToken))); }
/// <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(IJsonReader jsonTextReader) { List <JsonTextNode> items = new List <JsonTextNode>(); // consume the begin array token jsonTextReader.Read(); while (jsonTextReader.CurrentTokenType != JsonTokenType.EndArray) { items.Add(JsonTextParser.ParseNode(jsonTextReader)); } // consume the end array token jsonTextReader.Read(); return(ArrayNode.Create(items)); }
/// <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(IJsonReader jsonTextReader) { List <ObjectProperty> properties = new List <ObjectProperty>(); // consume the begin object token jsonTextReader.Read(); while (jsonTextReader.CurrentTokenType != JsonTokenType.EndObject) { ObjectProperty property = JsonTextParser.ParsePropertyNode(jsonTextReader); properties.Add(property); } // consume the end object token jsonTextReader.Read(); return(ObjectNode.Create(properties)); }
/// <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 JsonTextNode Parse(IJsonReader jsonTextReader) { if (jsonTextReader.SerializationFormat != JsonSerializationFormat.Text) { throw new ArgumentException("jsonTextReader's serialization format must actually be text"); } // Read past the json object not started state. jsonTextReader.Read(); JsonTextNode rootNode = JsonTextParser.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); }
/// <summary> /// Parses out a JSON AST node with a jsonTextReader. /// </summary> /// <param name="jsonTextReader">The reader to use as a lexer / tokenizer</param> /// <returns>JSON AST node (type determined by the reader)</returns> private static JsonTextNode ParseNode(IJsonReader jsonTextReader) { JsonTextNode node; switch (jsonTextReader.CurrentTokenType) { case JsonTokenType.BeginArray: node = JsonTextParser.ParseArrayNode(jsonTextReader); break; case JsonTokenType.BeginObject: node = JsonTextParser.ParseObjectNode(jsonTextReader); break; case JsonTokenType.String: node = JsonTextParser.ParseStringNode(jsonTextReader); break; case JsonTokenType.Number: node = JsonTextParser.ParseNumberNode(jsonTextReader); break; case JsonTokenType.True: node = JsonTextParser.ParseTrueNode(jsonTextReader); break; case JsonTokenType.False: node = JsonTextParser.ParseFalseNode(jsonTextReader); break; case JsonTokenType.Null: node = JsonTextParser.ParseNullNode(jsonTextReader); break; default: throw new JsonInvalidTokenException(); } return(node); }
/// <inheritdoc /> public override Number64 GetNumberValue() { ReadOnlySpan <byte> numberToken = this.jsonTextBuffer.GetBufferedRawJsonToken(this.token.Start, this.token.End).Span; return(JsonTextParser.GetNumberValue(numberToken)); }
private NumberNode(ReadOnlyMemory <byte> bufferedToken) : base(JsonNodeType.Number) { this.value = new Lazy <Number64>(() => JsonTextParser.GetNumberValue(bufferedToken.Span)); }
/// <summary> /// Parses out a JSON AST node with a jsonTextReader. /// </summary> /// <param name="jsonTextReader">The reader to use as a lexer / tokenizer</param> /// <returns>JSON AST node (type determined by the reader)</returns> private static JsonTextNode ParseNode(IJsonReader jsonTextReader) { JsonTextNode node; switch (jsonTextReader.CurrentTokenType) { case JsonTokenType.BeginArray: node = JsonTextParser.ParseArrayNode(jsonTextReader); break; case JsonTokenType.BeginObject: node = JsonTextParser.ParseObjectNode(jsonTextReader); break; case JsonTokenType.String: node = JsonTextParser.ParseStringNode(jsonTextReader); break; case JsonTokenType.Number: node = JsonTextParser.ParseNumberNode(jsonTextReader); break; case JsonTokenType.Float32: case JsonTokenType.Float64: node = JsonTextParser.ParseFloatNode(jsonTextReader, jsonTextReader.CurrentTokenType); break; case JsonTokenType.Int8: case JsonTokenType.Int16: case JsonTokenType.Int32: case JsonTokenType.Int64: case JsonTokenType.UInt32: node = JsonTextParser.ParseIntegerNode(jsonTextReader, jsonTextReader.CurrentTokenType); break; case JsonTokenType.True: node = JsonTextParser.ParseTrueNode(jsonTextReader); break; case JsonTokenType.False: node = JsonTextParser.ParseFalseNode(jsonTextReader); break; case JsonTokenType.Null: node = JsonTextParser.ParseNullNode(jsonTextReader); break; case JsonTokenType.Guid: node = JsonTextParser.ParseGuidNode(jsonTextReader); break; case JsonTokenType.Binary: node = JsonTextParser.ParseBinaryNode(jsonTextReader); break; default: throw new JsonInvalidTokenException(); } return(node); }