Browse Source

Merge pull request #5504 from crobibero/json-string-converter

(cherry picked from commit 1a0ce16f4d18b9a7850b52b299b4e6da15d40c53)
Signed-off-by: Joshua M. Boniface <joshua@boniface.me>
Bond-009 4 years ago
parent
commit
679d3f5873

+ 39 - 0
MediaBrowser.Common/Json/Converters/JsonStringConverter.cs

@@ -0,0 +1,39 @@
+using System;
+using System.Buffers;
+using System.Text;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace MediaBrowser.Common.Json.Converters
+{
+    /// <summary>
+    /// Converter to allow the serializer to read strings.
+    /// </summary>
+    public class JsonStringConverter : JsonConverter<string>
+    {
+        /// <inheritdoc />
+        public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            return reader.TokenType switch
+            {
+                JsonTokenType.Null => null,
+                JsonTokenType.String => reader.GetString(),
+                _ => GetRawValue(reader)
+            };
+        }
+
+        /// <inheritdoc />
+        public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
+        {
+            writer.WriteStringValue(value);
+        }
+
+        private static string GetRawValue(Utf8JsonReader reader)
+        {
+            var utf8Bytes = reader.HasValueSequence
+                ? reader.ValueSequence.ToArray()
+                : reader.ValueSpan;
+            return Encoding.UTF8.GetString(utf8Bytes);
+        }
+    }
+}

+ 2 - 1
MediaBrowser.Common/Json/JsonDefaults.cs

@@ -40,7 +40,8 @@ namespace MediaBrowser.Common.Json
                 new JsonStringEnumConverter(),
                 new JsonNullableStructConverterFactory(),
                 new JsonBoolNumberConverter(),
-                new JsonDateTimeConverter()
+                new JsonDateTimeConverter(),
+                new JsonStringConverter()
             }
         };
 

+ 39 - 0
tests/Jellyfin.Common.Tests/Json/JsonStringConverterTests.cs

@@ -0,0 +1,39 @@
+using System.Text.Json;
+using MediaBrowser.Common.Json.Converters;
+using Xunit;
+
+namespace Jellyfin.Common.Tests.Json
+{
+    public class JsonStringConverterTests
+    {
+        private readonly JsonSerializerOptions _jsonSerializerOptions
+            = new ()
+            {
+                Converters =
+                {
+                    new JsonStringConverter()
+                }
+            };
+
+        [Theory]
+        [InlineData("\"test\"", "test")]
+        [InlineData("123", "123")]
+        [InlineData("123.45", "123.45")]
+        [InlineData("true", "true")]
+        [InlineData("false", "false")]
+        public void Deserialize_String_Valid_Success(string input, string output)
+        {
+            var deserialized = JsonSerializer.Deserialize<string>(input, _jsonSerializerOptions);
+            Assert.Equal(deserialized, output);
+        }
+
+        [Fact]
+        public void Deserialize_Int32asInt32_Valid_Success()
+        {
+            const string? input = "123";
+            const int output = 123;
+            var deserialized = JsonSerializer.Deserialize<int>(input, _jsonSerializerOptions);
+            Assert.Equal(deserialized, output);
+        }
+    }
+}