diff --git a/src/OrchardCore/OrchardCore.Abstractions/Json/Extensions/JsonSerializerOptionsExtensions.cs b/src/OrchardCore/OrchardCore.Abstractions/Json/Extensions/JsonSerializerOptionsExtensions.cs new file mode 100644 index 00000000000..c126cbd6df2 --- /dev/null +++ b/src/OrchardCore/OrchardCore.Abstractions/Json/Extensions/JsonSerializerOptionsExtensions.cs @@ -0,0 +1,44 @@ +using System.Text.Json; + +namespace OrchardCore.Json.Extensions; + +public static class JsonSerializerOptionsExtensions +{ + /// + /// Merges the given into the current options. + /// + public static JsonSerializerOptions Merge(this JsonSerializerOptions destination, JsonSerializerOptions source) + { + destination.DefaultIgnoreCondition = source.DefaultIgnoreCondition; + destination.ReferenceHandler = source.ReferenceHandler; + destination.ReadCommentHandling = source.ReadCommentHandling; + destination.PropertyNameCaseInsensitive = source.PropertyNameCaseInsensitive; + destination.AllowTrailingCommas = source.AllowTrailingCommas; + destination.WriteIndented = source.WriteIndented; + destination.PropertyNamingPolicy = source.PropertyNamingPolicy; + destination.Encoder = source.Encoder; + destination.TypeInfoResolver = source.TypeInfoResolver; + + foreach (var resolver in source.TypeInfoResolverChain) + { + if (destination.TypeInfoResolverChain.Contains(resolver)) + { + continue; + } + + destination.TypeInfoResolverChain.Add(resolver); + } + + foreach (var converter in source.Converters) + { + if (destination.Converters.Contains(converter)) + { + continue; + } + + destination.Converters.Add(converter); + } + + return destination; + } +} diff --git a/src/OrchardCore/OrchardCore.Abstractions/Json/JsonOptionsConfigurations.cs b/src/OrchardCore/OrchardCore.Abstractions/Json/JsonOptionsConfigurations.cs new file mode 100644 index 00000000000..48ddd95f34d --- /dev/null +++ b/src/OrchardCore/OrchardCore.Abstractions/Json/JsonOptionsConfigurations.cs @@ -0,0 +1,21 @@ +using System.Text.Json; +using Microsoft.AspNetCore.Http.Json; +using Microsoft.Extensions.Options; +using OrchardCore.Json.Extensions; + +namespace OrchardCore.Json; + +public class JsonOptionsConfigurations : IConfigureOptions +{ + private readonly JsonSerializerOptions _jsonSerializerOptions; + + public JsonOptionsConfigurations(IOptions jsonSerializerOptions) + { + _jsonSerializerOptions = jsonSerializerOptions.Value; + } + + public void Configure(JsonOptions options) + { + options.SerializerOptions.Merge(_jsonSerializerOptions); + } +} diff --git a/src/OrchardCore/OrchardCore/Modules/Extensions/ServiceCollectionExtensions.cs b/src/OrchardCore/OrchardCore/Modules/Extensions/ServiceCollectionExtensions.cs index f3bf77e1cea..7cf8b17a56c 100644 --- a/src/OrchardCore/OrchardCore/Modules/Extensions/ServiceCollectionExtensions.cs +++ b/src/OrchardCore/OrchardCore/Modules/Extensions/ServiceCollectionExtensions.cs @@ -11,6 +11,7 @@ using Microsoft.AspNetCore.DataProtection.XmlEncryption; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Json; using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Localization; @@ -30,6 +31,7 @@ using OrchardCore.Environment.Shell.Configuration; using OrchardCore.Environment.Shell.Descriptor.Models; using OrchardCore.Extensions; +using OrchardCore.Json; using OrchardCore.Localization; using OrchardCore.Locking; using OrchardCore.Locking.Distributed; @@ -154,6 +156,7 @@ private static void AddDefaultServices(OrchardCoreBuilder builder) services.AddSingleton(); + services.AddTransient, JsonOptionsConfigurations>(); services.AddTransient, JsonSerializerOptionsConfiguration>(); services.AddScoped();