using System.Text.Json; using System.Text.Json.Serialization; using System.Text.Json.Serialization.Metadata; using Jellyfin.Extensions.Json.Converters; namespace Jellyfin.Extensions.Json { /// /// Helper class for having compatible JSON throughout the codebase. /// public static class JsonDefaults { /// /// Pascal case json profile media type. /// public const string PascalCaseMediaType = "application/json; profile=\"PascalCase\""; /// /// Camel case json profile media type. /// public const string CamelCaseMediaType = "application/json; profile=\"CamelCase\""; /// /// When changing these options, update /// Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs /// -> AddJellyfinApi /// -> AddJsonOptions. /// private static readonly JsonSerializerOptions _jsonSerializerOptions = new() { ReadCommentHandling = JsonCommentHandling.Disallow, WriteIndented = false, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, NumberHandling = JsonNumberHandling.AllowReadingFromString, Converters = { new JsonGuidConverter(), new JsonNullableGuidConverter(), new JsonVersionConverter(), new JsonFlagEnumConverterFactory(), new JsonDefaultStringEnumConverterFactory(), new JsonStringEnumConverter(), new JsonNullableStructConverterFactory(), new JsonDateTimeConverter(), new JsonStringConverter() }, TypeInfoResolver = new DefaultJsonTypeInfoResolver() }; private static readonly JsonSerializerOptions _pascalCaseJsonSerializerOptions = new(_jsonSerializerOptions) { PropertyNamingPolicy = null }; private static readonly JsonSerializerOptions _camelCaseJsonSerializerOptions = new(_jsonSerializerOptions) { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }; /// /// Gets the default options. /// /// /// The return value must not be modified. /// If the defaults must be modified the author must use the copy constructor. /// /// The default options. public static JsonSerializerOptions Options => _jsonSerializerOptions; /// /// Gets camelCase json options. /// /// /// The return value must not be modified. /// If the defaults must be modified the author must use the copy constructor. /// /// The camelCase options. public static JsonSerializerOptions CamelCaseOptions => _camelCaseJsonSerializerOptions; /// /// Gets PascalCase json options. /// /// /// The return value must not be modified. /// If the defaults must be modified the author must use the copy constructor. /// /// The PascalCase options. public static JsonSerializerOptions PascalCaseOptions => _pascalCaseJsonSerializerOptions; } }