diff options
| author | Bond-009 <bond.009@outlook.com> | 2020-02-04 12:21:42 +0100 |
|---|---|---|
| committer | Bond-009 <bond.009@outlook.com> | 2020-02-04 12:21:42 +0100 |
| commit | ba1ffbabd3c1fc610b3f0a3de47dbc670920f915 (patch) | |
| tree | 069c76ee43d1bb5ca4ee1f72f0c95edfe484ed7e /MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs | |
| parent | 5dc3874ebdeac26d7be885b9a44ca1321b4b25cf (diff) | |
| parent | 176e8509739ffd3d7002c94adbd814c33b5172e2 (diff) | |
Merge branch 'master' into nullable2
Diffstat (limited to 'MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs')
| -rw-r--r-- | MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs b/MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs new file mode 100644 index 000000000..fe5dd6cd4 --- /dev/null +++ b/MediaBrowser.Common/Json/Converters/JsonInt32Converter.cs @@ -0,0 +1,53 @@ +using System; +using System.Buffers; +using System.Buffers.Text; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace MediaBrowser.Common.Json.Converters +{ + /// <summary> + /// Converts a GUID object or value to/from JSON. + /// </summary> + public class JsonInt32Converter : JsonConverter<int> + { + /// <inheritdoc /> + public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + static void ThrowFormatException() => throw new FormatException("Invalid format for an integer."); + ReadOnlySpan<byte> span = stackalloc byte[0]; + + if (reader.HasValueSequence) + { + long sequenceLength = reader.ValueSequence.Length; + Span<byte> stackSpan = stackalloc byte[(int)sequenceLength]; + reader.ValueSequence.CopyTo(stackSpan); + span = stackSpan; + } + else + { + span = reader.ValueSpan; + } + + if (!Utf8Parser.TryParse(span, out int number, out _)) + { + ThrowFormatException(); + } + + return number; + } + + /// <inheritdoc /> + public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options) + { + static void ThrowInvalidOperationException() => throw new InvalidOperationException(); + Span<byte> span = stackalloc byte[16]; + if (Utf8Formatter.TryFormat(value, span, out int bytesWritten)) + { + writer.WriteStringValue(span.Slice(0, bytesWritten)); + } + + ThrowInvalidOperationException(); + } + } +} |
