Forráskód Böngészése

Fallback to base jsonconverter

crobibero 4 éve
szülő
commit
eb400f7292

+ 16 - 15
MediaBrowser.Common/Json/Converters/JsonNullableInt32Converter.cs

@@ -10,31 +10,32 @@ namespace MediaBrowser.Common.Json.Converters
     /// </summary>
     public class JsonNullableInt32Converter : JsonConverter<int?>
     {
+        private readonly JsonConverter<int?> _baseJsonConverter;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="JsonNullableInt32Converter"/> class.
+        /// </summary>
+        /// <param name="baseJsonConverter">The base json converter.</param>
+        public JsonNullableInt32Converter(JsonConverter<int?> baseJsonConverter)
+        {
+            _baseJsonConverter = baseJsonConverter;
+        }
+
         /// <inheritdoc />
         public override int? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
         {
-            switch (reader.TokenType)
+            if (reader.TokenType == JsonTokenType.String && ((reader.HasValueSequence && reader.ValueSequence.IsEmpty) || reader.ValueSpan.IsEmpty))
             {
-                case JsonTokenType.String when (reader.HasValueSequence && reader.ValueSequence.IsEmpty) || reader.ValueSpan.IsEmpty:
-                case JsonTokenType.Null:
-                    return null;
-                default:
-                    // fallback to default handling
-                    return reader.GetInt32();
+                return null;
             }
+
+            return _baseJsonConverter.Read(ref reader, typeToConvert, options);
         }
 
         /// <inheritdoc />
         public override void Write(Utf8JsonWriter writer, int? value, JsonSerializerOptions options)
         {
-            if (value is null)
-            {
-                writer.WriteNullValue();
-            }
-            else
-            {
-                writer.WriteNumberValue(value.Value);
-            }
+            _baseJsonConverter.Write(writer, value, options);
         }
     }
 }

+ 19 - 29
MediaBrowser.Common/Json/Converters/JsonNullableInt64Converter.cs

@@ -1,52 +1,42 @@
 using System;
+using System.ComponentModel;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
 namespace MediaBrowser.Common.Json.Converters
 {
     /// <summary>
-    /// Parse JSON string as nullable long.
-    /// Javascript does not support 64-bit integers.
+    /// Converts a nullable int64 object or value to/from JSON.
     /// Required - some clients send an empty string.
     /// </summary>
     public class JsonNullableInt64Converter : JsonConverter<long?>
     {
+        private readonly JsonConverter<long?> _baseJsonConverter;
+
         /// <summary>
-        /// Read JSON string as int64.
+        /// Initializes a new instance of the <see cref="JsonNullableInt64Converter"/> class.
         /// </summary>
-        /// <param name="reader"><see cref="Utf8JsonReader"/>.</param>
-        /// <param name="type">Type.</param>
-        /// <param name="options">Options.</param>
-        /// <returns>Parsed value.</returns>
-        public override long? Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
+        /// <param name="baseJsonConverter">The base json converter.</param>
+        public JsonNullableInt64Converter(JsonConverter<long?> baseJsonConverter)
+        {
+            _baseJsonConverter = baseJsonConverter;
+        }
+
+        /// <inheritdoc />
+        public override long? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
         {
-            switch (reader.TokenType)
+            if (reader.TokenType == JsonTokenType.String && ((reader.HasValueSequence && reader.ValueSequence.IsEmpty) || reader.ValueSpan.IsEmpty))
             {
-                case JsonTokenType.String when (reader.HasValueSequence && reader.ValueSequence.IsEmpty) || reader.ValueSpan.IsEmpty:
-                case JsonTokenType.Null:
-                    return null;
-                default:
-                    // fallback to default handling
-                    return reader.GetInt64();
+                return null;
             }
+
+            return _baseJsonConverter.Read(ref reader, typeToConvert, options);
         }
 
-        /// <summary>
-        /// Write long to JSON long.
-        /// </summary>
-        /// <param name="writer"><see cref="Utf8JsonWriter"/>.</param>
-        /// <param name="value">Value to write.</param>
-        /// <param name="options">Options.</param>
+        /// <inheritdoc />
         public override void Write(Utf8JsonWriter writer, long? value, JsonSerializerOptions options)
         {
-            if (value is null)
-            {
-                writer.WriteNullValue();
-            }
-            else
-            {
-                writer.WriteNumberValue(value.Value);
-            }
+            _baseJsonConverter.Write(writer, value, options);
         }
     }
 }

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

@@ -29,10 +29,14 @@ namespace MediaBrowser.Common.Json
                 NumberHandling = JsonNumberHandling.AllowReadingFromString
             };
 
+            // Get built-in converters for fallback converting.
+            var baseNullableInt32Converter = (JsonConverter<int?>)options.GetConverter(typeof(int?));
+            var baseNullableInt64Converter = (JsonConverter<long?>)options.GetConverter(typeof(long?));
+
             options.Converters.Add(new JsonGuidConverter());
             options.Converters.Add(new JsonStringEnumConverter());
-            options.Converters.Add(new JsonNullableInt32Converter());
-            options.Converters.Add(new JsonNullableInt64Converter());
+            options.Converters.Add(new JsonNullableInt32Converter(baseNullableInt32Converter));
+            options.Converters.Add(new JsonNullableInt64Converter(baseNullableInt64Converter));
 
             return options;
         }