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();