diff --git a/src/Umbraco.PublishedCache.HybridCache/Serialization/JsonContentNestedDataSerializer.cs b/src/Umbraco.PublishedCache.HybridCache/Serialization/JsonContentNestedDataSerializer.cs index a580b07b37..cfe1fb2425 100644 --- a/src/Umbraco.PublishedCache.HybridCache/Serialization/JsonContentNestedDataSerializer.cs +++ b/src/Umbraco.PublishedCache.HybridCache/Serialization/JsonContentNestedDataSerializer.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using System.Text.Json.Serialization; using Umbraco.Cms.Core.Models; @@ -8,7 +8,11 @@ internal class JsonContentNestedDataSerializer : IContentCacheDataSerializer { private static readonly JsonSerializerOptions _jsonSerializerOptions = new() { - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + Converters = + { + new JsonObjectConverter(), + }, }; /// diff --git a/src/Umbraco.PublishedCache.HybridCache/Serialization/JsonObjectConverter.cs b/src/Umbraco.PublishedCache.HybridCache/Serialization/JsonObjectConverter.cs new file mode 100644 index 0000000000..a28ccf0562 --- /dev/null +++ b/src/Umbraco.PublishedCache.HybridCache/Serialization/JsonObjectConverter.cs @@ -0,0 +1,22 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using Umbraco.Cms.Core.Models; + +namespace Umbraco.Cms.Infrastructure.HybridCache.Serialization; + +internal class JsonObjectConverter : JsonConverter +{ + public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + => reader.TokenType switch + { + JsonTokenType.String => reader.GetString(), + JsonTokenType.Number => reader.TryGetInt64(out var l) ? l : reader.GetDouble(), + JsonTokenType.True => true, + JsonTokenType.False => false, + JsonTokenType.Null => null, + _ => JsonDocument.ParseValue(ref reader).RootElement.Clone(), // fallback for complex types + }; + + public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options) + => JsonSerializer.Serialize(writer, value, value.GetType(), options); +}