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); } }
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)); }
/// <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); }
/// <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); }
/// <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); }
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; } } } }