コード例 #1
0
        private static void VerifyWriter <T>(JsonSerializationFormat jsonSerializationFormat, T expectedDeserializedValue)
        {
            using (CosmosDBToNewtonsoftWriter writer = new CosmosDBToNewtonsoftWriter(jsonSerializationFormat))
            {
                Newtonsoft.Json.JsonSerializer serializer = new Newtonsoft.Json.JsonSerializer();
                serializer.Serialize(writer, expectedDeserializedValue);

                ReadOnlyMemory <byte> result = writer.GetResult();
                string actualSerializedValue;
                if (jsonSerializationFormat == JsonSerializationFormat.Binary)
                {
                    actualSerializedValue = JsonTestUtils.ConvertBinaryToText(result);
                }
                else
                {
                    actualSerializedValue = Utf8Span.UnsafeFromUtf8BytesNoValidation(result.Span).ToString();
                }

                actualSerializedValue = NewtonsoftInteropTests.NewtonsoftFormat(actualSerializedValue);
                string expectedSerializedValue = NewtonsoftInteropTests.NewtonsoftFormat(
                    JsonConvert.SerializeObject(
                        expectedDeserializedValue));
                Assert.AreEqual(expectedSerializedValue, actualSerializedValue);
            }
        }
コード例 #2
0
        public bool TryAddString(string value, out int index)
        {
            int         utf8Length = Encoding.UTF8.GetByteCount(value);
            Span <byte> utfString  = utf8Length < JsonStringDictionary.MaxStackAllocSize ? stackalloc byte[utf8Length] : new byte[utf8Length];

            Encoding.UTF8.GetBytes(value, utfString);

            return(this.TryAddString(Utf8Span.UnsafeFromUtf8BytesNoValidation(utfString), out index));
        }
コード例 #3
0
            /// <inheritdoc />
            public override void WriteStringValue(string value)
            {
                int         utf8Length = Encoding.UTF8.GetByteCount(value);
                Span <byte> utf8Buffer = utf8Length < JsonBinaryWriter.MaxStackAllocSize ? stackalloc byte[utf8Length] : new byte[utf8Length];

                Encoding.UTF8.GetBytes(value, utf8Buffer);
                Utf8Span utf8StringValue = Utf8Span.UnsafeFromUtf8BytesNoValidation(utf8Buffer);

                this.WriteFieldNameOrString(isFieldName: false, utf8StringValue);
            }
コード例 #4
0
            /// <inheritdoc />
            public override void WriteStringValue(string value)
            {
                int         utf8Length = Encoding.UTF8.GetByteCount(value);
                Span <byte> utf8Buffer = utf8Length < JsonTextWriter.MaxStackAlloc ? stackalloc byte[utf8Length] : new byte[utf8Length];

                Encoding.UTF8.GetBytes(value, utf8Buffer);
                Utf8Span utf8Value = Utf8Span.UnsafeFromUtf8BytesNoValidation(utf8Buffer);

                this.WriteStringValue(utf8Value);
            }
コード例 #5
0
        /// <inheritdoc />
        public virtual void WriteFieldName(string fieldName)
        {
            int         utf8Length = Encoding.UTF8.GetByteCount(fieldName);
            Span <byte> utf8Buffer = utf8Length < JsonTextWriter.MaxStackAlloc ? stackalloc byte[utf8Length] : new byte[utf8Length];

            Encoding.UTF8.GetBytes(fieldName, utf8Buffer);
            Utf8Span utf8FieldName = Utf8Span.UnsafeFromUtf8BytesNoValidation(utf8Buffer);

            this.WriteFieldName(utf8FieldName);
        }
コード例 #6
0
            private void WriteEscapedString(Utf8Span unescapedString)
            {
                while (!unescapedString.IsEmpty)
                {
                    int?indexOfFirstCharacterThatNeedsEscaping = JsonTextWriter.IndexOfCharacterThatNeedsEscaping(unescapedString);
                    if (!indexOfFirstCharacterThatNeedsEscaping.HasValue)
                    {
                        // No escaping needed;
                        indexOfFirstCharacterThatNeedsEscaping = unescapedString.Length;
                    }

                    // Write as much of the string as possible
                    this.jsonTextMemoryWriter.Write(
                        unescapedString.Span.Slice(
                            start: 0,
                            length: indexOfFirstCharacterThatNeedsEscaping.Value));
                    unescapedString = Utf8Span.UnsafeFromUtf8BytesNoValidation(unescapedString.Span.Slice(start: indexOfFirstCharacterThatNeedsEscaping.Value));

                    // Escape the next character if it exists
                    if (!unescapedString.IsEmpty)
                    {
                        byte character = unescapedString.Span[0];
                        unescapedString = Utf8Span.UnsafeFromUtf8BytesNoValidation(unescapedString.Span.Slice(start: 1));

                        switch (character)
                        {
                        case (byte)'\\':
                            this.jsonTextMemoryWriter.Write((byte)'\\');
                            this.jsonTextMemoryWriter.Write((byte)'\\');
                            break;

                        case (byte)'"':
                            this.jsonTextMemoryWriter.Write((byte)'\\');
                            this.jsonTextMemoryWriter.Write((byte)'"');
                            break;

                        case (byte)'/':
                            this.jsonTextMemoryWriter.Write((byte)'\\');
                            this.jsonTextMemoryWriter.Write((byte)'/');
                            break;

                        case (byte)'\b':
                            this.jsonTextMemoryWriter.Write((byte)'\\');
                            this.jsonTextMemoryWriter.Write((byte)'b');
                            break;

                        case (byte)'\f':
                            this.jsonTextMemoryWriter.Write((byte)'\\');
                            this.jsonTextMemoryWriter.Write((byte)'f');
                            break;

                        case (byte)'\n':
                            this.jsonTextMemoryWriter.Write((byte)'\\');
                            this.jsonTextMemoryWriter.Write((byte)'n');
                            break;

                        case (byte)'\r':
                            this.jsonTextMemoryWriter.Write((byte)'\\');
                            this.jsonTextMemoryWriter.Write((byte)'r');
                            break;

                        case (byte)'\t':
                            this.jsonTextMemoryWriter.Write((byte)'\\');
                            this.jsonTextMemoryWriter.Write((byte)'t');
                            break;

                        default:
                            char wideCharToEscape = (char)character;
                            // We got a control character (U+0000 through U+001F).
                            this.jsonTextMemoryWriter.Write((byte)'\\');
                            this.jsonTextMemoryWriter.Write((byte)'u');
                            this.jsonTextMemoryWriter.Write(GetHexDigit((wideCharToEscape >> 12) & 0xF));
                            this.jsonTextMemoryWriter.Write(GetHexDigit((wideCharToEscape >> 8) & 0xF));
                            this.jsonTextMemoryWriter.Write(GetHexDigit((wideCharToEscape >> 4) & 0xF));
                            this.jsonTextMemoryWriter.Write(GetHexDigit((wideCharToEscape >> 0) & 0xF));
                            break;
                        }
                    }
                }
            }