Ver código fonte

Merge pull request #4855 from crobibero/cache-json-serializer

Initialize JsonSerializerOptions statically
Bond-009 4 anos atrás
pai
commit
f42208673f
1 arquivos alterados com 46 adições e 32 exclusões
  1. 46 32
      MediaBrowser.Common/Json/JsonDefaults.cs

+ 46 - 32
MediaBrowser.Common/Json/JsonDefaults.cs

@@ -19,56 +19,70 @@ namespace MediaBrowser.Common.Json
         /// </summary>
         public const string CamelCaseMediaType = "application/json; profile=\"CamelCase\"";
 
+        /// <summary>
+        /// When changing these options, update
+        ///  Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs
+        ///   -> AddJellyfinApi
+        ///    -> AddJsonOptions.
+        /// </summary>
+        private static readonly JsonSerializerOptions _jsonSerializerOptions = new ()
+        {
+            ReadCommentHandling = JsonCommentHandling.Disallow,
+            WriteIndented = false,
+            DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
+            NumberHandling = JsonNumberHandling.AllowReadingFromString,
+            Converters =
+            {
+                new JsonGuidConverter(),
+                new JsonVersionConverter(),
+                new JsonStringEnumConverter(),
+                new JsonNullableStructConverterFactory(),
+                new JsonBoolNumberConverter(),
+                new JsonDateTimeConverter()
+            }
+        };
+
+        private static readonly JsonSerializerOptions _pascalCaseJsonSerializerOptions = new (_jsonSerializerOptions)
+        {
+            PropertyNamingPolicy = null
+        };
+
+        private static readonly JsonSerializerOptions _camelCaseJsonSerializerOptions = new (_jsonSerializerOptions)
+        {
+            PropertyNamingPolicy = JsonNamingPolicy.CamelCase
+        };
+
         /// <summary>
         /// Gets the default <see cref="JsonSerializerOptions" /> options.
         /// </summary>
         /// <remarks>
-        /// When changing these options, update
-        ///     Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs
-        ///         -> AddJellyfinApi
-        ///             -> AddJsonOptions.
+        /// The return value must not be modified.
+        /// If the defaults must be modified the author must use the copy constructor.
         /// </remarks>
         /// <returns>The default <see cref="JsonSerializerOptions" /> options.</returns>
         public static JsonSerializerOptions GetOptions()
-        {
-            var options = new JsonSerializerOptions
-            {
-                ReadCommentHandling = JsonCommentHandling.Disallow,
-                WriteIndented = false,
-                DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
-                NumberHandling = JsonNumberHandling.AllowReadingFromString
-            };
-
-            options.Converters.Add(new JsonGuidConverter());
-            options.Converters.Add(new JsonVersionConverter());
-            options.Converters.Add(new JsonStringEnumConverter());
-            options.Converters.Add(new JsonNullableStructConverterFactory());
-            options.Converters.Add(new JsonBoolNumberConverter());
-            options.Converters.Add(new JsonDateTimeConverter());
-
-            return options;
-        }
+            => _jsonSerializerOptions;
 
         /// <summary>
         /// Gets camelCase json options.
         /// </summary>
+        /// <remarks>
+        /// The return value must not be modified.
+        /// If the defaults must be modified the author must use the copy constructor.
+        /// </remarks>
         /// <returns>The camelCase <see cref="JsonSerializerOptions" /> options.</returns>
         public static JsonSerializerOptions GetCamelCaseOptions()
-        {
-            var options = GetOptions();
-            options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
-            return options;
-        }
+            => _camelCaseJsonSerializerOptions;
 
         /// <summary>
         /// Gets PascalCase json options.
         /// </summary>
+        /// <remarks>
+        /// The return value must not be modified.
+        /// If the defaults must be modified the author must use the copy constructor.
+        /// </remarks>
         /// <returns>The PascalCase <see cref="JsonSerializerOptions" /> options.</returns>
         public static JsonSerializerOptions GetPascalCaseOptions()
-        {
-            var options = GetOptions();
-            options.PropertyNamingPolicy = null;
-            return options;
-        }
+            => _pascalCaseJsonSerializerOptions;
     }
 }