From ba2072c9795fd4451b53f9709d39eeea9dcf068c Mon Sep 17 00:00:00 2001 From: Davor Zlotrg Date: Mon, 30 Jun 2025 14:07:00 +0200 Subject: [PATCH] fix: json serialization and deserialization for NuCacheSerializerType (#19617) fix: json serialization and deserialization --- .../JsonContentNestedDataSerializer.cs | 8 +++++-- .../Serialization/JsonObjectConverter.cs | 22 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 src/Umbraco.PublishedCache.HybridCache/Serialization/JsonObjectConverter.cs 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); +}