private static FloatNode ParseFloatNode(IJsonReader jsonTextReader, JsonTokenType jsonTokenType)
                {
                    ReadOnlyMemory <byte> bytes = jsonTextReader.GetBufferedRawJsonToken();

                    FloatNode floatNode;

                    switch (jsonTokenType)
                    {
                    case JsonTokenType.Float32:
                        floatNode = Float32Node.Create(bytes);
                        break;

                    case JsonTokenType.Float64:
                        floatNode = Float64Node.Create(bytes);
                        break;

                    default:
                        throw new ArgumentException($"Unknown {nameof(JsonTokenType)}: {jsonTokenType}");
                    }

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

                    return(floatNode);
                }
Example #2
0
                private static BinaryNode ParseBinaryNode(IJsonReader jsonTextReader)
                {
                    BinaryNode node = BinaryNode.Create(jsonTextReader.GetBufferedRawJsonToken());

                    // advance the reader forward.
                    jsonTextReader.Read();
                    return(node);
                }
                /// <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(IJsonReader jsonTextReader)
                {
                    NumberNode numberNode = NumberNode.Create(jsonTextReader.GetBufferedRawJsonToken());

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

                    return(numberNode);
                }
                /// <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(IJsonReader jsonTextReader)
                {
                    StringNode stringNode = StringNode.Create(jsonTextReader.GetBufferedRawJsonToken());

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

                    return(stringNode);
                }
                /// <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(IJsonReader jsonTextReader)
                {
                    NumberNode numberNode = NumberNode.Create((ArraySegment<byte>)jsonTextReader.GetBufferedRawJsonToken());

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

                    return numberNode;
                }
                /// <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(IJsonReader jsonTextReader)
                {
                    StringNode stringNode = StringNode.Create((ArraySegment<byte>)jsonTextReader.GetBufferedRawJsonToken());

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

                    return stringNode;
                }
                /// <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(IJsonReader jsonTextReader)
                {
                    FieldNameNode fieldName = FieldNameNode.Create(jsonTextReader.GetBufferedRawJsonToken());

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

                    JsonTextNode value = Parser.ParseNode(jsonTextReader);

                    return(new ObjectProperty(fieldName, value));
                }
                private static IntegerNode ParseIntegerNode(IJsonReader jsonTextReader, JsonTokenType jsonTokenType)
                {
                    ReadOnlyMemory <byte> bytes = jsonTextReader.GetBufferedRawJsonToken();

                    IntegerNode integerNode;

                    switch (jsonTokenType)
                    {
                    case JsonTokenType.Int8:
                        integerNode = Int8Node.Create(bytes);
                        break;

                    case JsonTokenType.Int16:
                        integerNode = Int16Node.Create(bytes);
                        break;

                    case JsonTokenType.Int32:
                        integerNode = Int32Node.Create(bytes);
                        break;

                    case JsonTokenType.Int64:
                        integerNode = Int64Node.Create(bytes);
                        break;

                    case JsonTokenType.UInt32:
                        integerNode = UInt32Node.Create(bytes);
                        break;

                    default:
                        throw new ArgumentException($"Unknown {nameof(JsonTokenType)}: {jsonTokenType}");
                    }

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

                    return(integerNode);
                }
Example #9
0
        /// <summary>
        /// Writes current token from a json reader to the internal buffer.
        /// </summary>
        /// <param name="jsonReader">The JsonReader to the get the current token from.</param>
        public void WriteCurrentToken(IJsonReader jsonReader)
        {
            if (jsonReader == null)
            {
                throw new ArgumentNullException("jsonReader can not be null");
            }

            // For now we don't optimize for text, since the reader could be UTF-8 and the writer could be UTF-16.
            // We need to add more enums for the different serialization formats.
            bool sameFormat = jsonReader.SerializationFormat == this.SerializationFormat && (this.SerializationFormat == JsonSerializationFormat.Binary || this.SerializationFormat == JsonSerializationFormat.HybridRow);

            JsonTokenType jsonTokenType = jsonReader.CurrentTokenType;

            switch (jsonTokenType)
            {
            case JsonTokenType.NotStarted:
                break;

            case JsonTokenType.BeginArray:
                this.WriteArrayStart();
                break;

            case JsonTokenType.EndArray:
                this.WriteArrayEnd();
                break;

            case JsonTokenType.BeginObject:
                this.WriteObjectStart();
                break;

            case JsonTokenType.EndObject:
                this.WriteObjectEnd();
                break;

            case JsonTokenType.True:
                this.WriteBoolValue(true);
                break;

            case JsonTokenType.False:
                this.WriteBoolValue(false);
                break;

            case JsonTokenType.Null:
                this.WriteNullValue();
                break;

            case JsonTokenType.String:
            case JsonTokenType.Number:
            case JsonTokenType.FieldName:
            {
                if (sameFormat)
                {
                    IReadOnlyList <byte> bufferedRawJson = jsonReader.GetBufferedRawJsonToken();
                    this.WriteRawJsonToken(jsonTokenType, bufferedRawJson);
                }
                else
                {
                    if (jsonTokenType == JsonTokenType.Number)
                    {
                        double number = jsonReader.GetNumberValue();
                        this.WriteNumberValue(number);
                    }
                    else
                    {
                        string value = jsonReader.GetStringValue();
                        if (jsonTokenType == JsonTokenType.FieldName)
                        {
                            this.WriteFieldName(value);
                        }
                        else
                        {
                            this.WriteStringValue(value);
                        }
                    }
                }

                break;
            }

            default:
                throw new ArgumentException($"Unexpected JsonTokenType: {jsonTokenType}");
            }
        }
 private static BinaryNode ParseBinaryNode(IJsonReader jsonTextReader)
 {
     return(BinaryNode.Create(jsonTextReader.GetBufferedRawJsonToken()));
 }
 private static GuidNode ParseGuidNode(IJsonReader jsonTextReader)
 {
     return(GuidNode.Create(jsonTextReader.GetBufferedRawJsonToken()));
 }
Example #12
0
        /// <summary>
        /// Writes current token from a json reader to the internal buffer.
        /// </summary>
        /// <param name="jsonReader">The JsonReader to the get the current token from.</param>
        public void WriteCurrentToken(IJsonReader jsonReader)
        {
            if (jsonReader == null)
            {
                throw new ArgumentNullException("jsonReader can not be null");
            }

            // For now we don't optimize for text, since the reader could be UTF-8 and the writer could be UTF-16.
            // We need to add more enums for the different serialization formats.
            bool sameFormat = jsonReader.SerializationFormat == this.SerializationFormat && (this.SerializationFormat == JsonSerializationFormat.Binary || this.SerializationFormat == JsonSerializationFormat.HybridRow);

            JsonTokenType jsonTokenType = jsonReader.CurrentTokenType;

            switch (jsonTokenType)
            {
            case JsonTokenType.NotStarted:
                break;

            case JsonTokenType.BeginArray:
                this.WriteArrayStart();
                break;

            case JsonTokenType.EndArray:
                this.WriteArrayEnd();
                break;

            case JsonTokenType.BeginObject:
                this.WriteObjectStart();
                break;

            case JsonTokenType.EndObject:
                this.WriteObjectEnd();
                break;

            case JsonTokenType.True:
                this.WriteBoolValue(true);
                break;

            case JsonTokenType.False:
                this.WriteBoolValue(false);
                break;

            case JsonTokenType.Null:
                this.WriteNullValue();
                break;

            default:
            {
                if (sameFormat)
                {
                    ReadOnlySpan <byte> bufferedRawJson = jsonReader.GetBufferedRawJsonToken().Span;
                    this.WriteRawJsonToken(jsonTokenType, bufferedRawJson);
                }
                else
                {
                    switch (jsonTokenType)
                    {
                    case JsonTokenType.String:
                    case JsonTokenType.FieldName:
                    {
                        string value = jsonReader.GetStringValue();
                        if (jsonTokenType == JsonTokenType.FieldName)
                        {
                            this.WriteFieldName(value);
                        }
                        else
                        {
                            this.WriteStringValue(value);
                        }

                        break;
                    }

                    case JsonTokenType.Number:
                    {
                        Number64 value = jsonReader.GetNumberValue();
                        this.WriteNumberValue(value);
                    }
                    break;

                    case JsonTokenType.Int8:
                    {
                        sbyte value = jsonReader.GetInt8Value();
                        this.WriteInt8Value(value);
                    }
                    break;

                    case JsonTokenType.Int16:
                    {
                        short value = jsonReader.GetInt16Value();
                        this.WriteInt16Value(value);
                    }
                    break;

                    case JsonTokenType.Int32:
                    {
                        int value = jsonReader.GetInt32Value();
                        this.WriteInt32Value(value);
                    }
                    break;

                    case JsonTokenType.Int64:
                    {
                        long value = jsonReader.GetInt64Value();
                        this.WriteInt64Value(value);
                    }
                    break;

                    case JsonTokenType.UInt32:
                    {
                        uint value = jsonReader.GetUInt32Value();
                        this.WriteUInt32Value(value);
                    }
                    break;

                    case JsonTokenType.Float32:
                    {
                        float value = jsonReader.GetFloat32Value();
                        this.WriteFloat32Value(value);
                    }
                    break;

                    case JsonTokenType.Float64:
                    {
                        double value = jsonReader.GetFloat64Value();
                        this.WriteFloat64Value(value);
                    }
                    break;

                    case JsonTokenType.Guid:
                    {
                        Guid value = jsonReader.GetGuidValue();
                        this.WriteGuidValue(value);
                    }
                    break;

                    case JsonTokenType.Binary:
                    {
                        ReadOnlyMemory <byte> value = jsonReader.GetBinaryValue();
                        this.WriteBinaryValue(value.Span);
                    }
                    break;

                    default:
                        throw new ArgumentException($"Unexpected JsonTokenType: {jsonTokenType}");
                    }
                }
            }
            break;
            }
        }
        /// <summary>
        /// Writes current token from a json reader to the internal buffer.
        /// </summary>
        /// <param name="jsonReader">The JsonReader to the get the current token from.</param>
        public void WriteCurrentToken(IJsonReader jsonReader)
        {
            if (jsonReader == null)
            {
                throw new ArgumentNullException("jsonReader can not be null");
            }

            // For now short circuit this to false until we figure out how to optimize this.
            bool sameFormat = jsonReader.SerializationFormat == this.SerializationFormat && false;

            JsonTokenType jsonTokenType = jsonReader.CurrentTokenType;

            switch (jsonTokenType)
            {
            case JsonTokenType.NotStarted:
                break;

            case JsonTokenType.BeginArray:
                this.WriteArrayStart();
                break;

            case JsonTokenType.EndArray:
                this.WriteArrayEnd();
                break;

            case JsonTokenType.BeginObject:
                this.WriteObjectStart();
                break;

            case JsonTokenType.EndObject:
                this.WriteObjectEnd();
                break;

            case JsonTokenType.True:
                this.WriteBoolValue(true);
                break;

            case JsonTokenType.False:
                this.WriteBoolValue(false);
                break;

            case JsonTokenType.Null:
                this.WriteNullValue();
                break;

            case JsonTokenType.String:
            case JsonTokenType.Number:
            case JsonTokenType.FieldName:
            {
                if (sameFormat)
                {
                    IReadOnlyList <byte> bufferedRawJson = jsonReader.GetBufferedRawJsonToken();
                    this.WriteRawJsonToken(jsonTokenType, bufferedRawJson);
                }
                else
                {
                    if (jsonTokenType == JsonTokenType.Number)
                    {
                        double number = jsonReader.GetNumberValue();
                        this.WriteNumberValue(number);
                    }
                    else
                    {
                        string value = jsonReader.GetStringValue();
                        if (jsonTokenType == JsonTokenType.FieldName)
                        {
                            this.WriteFieldName(value);
                        }
                        else
                        {
                            this.WriteStringValue(value);
                        }
                    }
                }

                break;
            }

            default:
                throw new ArgumentException($"Unexpected JsonTokenType: {jsonTokenType}");
            }
        }