From e12fbdf5b7bfa2003ab403f4bbd036a6dc202c7b Mon Sep 17 00:00:00 2001 From: kjac Date: Mon, 20 Feb 2023 11:05:56 +0100 Subject: [PATCH] Add Udi and GuidUdi support in JSON serializer --- .../ConfigureUmbracoBackofficeJsonOptions.cs | 2 ++ .../Serialization/JsonGuidUdiConverter.cs | 20 +++++++++++++++++++ .../Serialization/JsonUdiConverter.cs | 20 +++++++++++++++++++ .../Serialization/SystemTextJsonSerializer.cs | 2 ++ 4 files changed, 44 insertions(+) create mode 100644 src/Umbraco.Infrastructure/Serialization/JsonGuidUdiConverter.cs create mode 100644 src/Umbraco.Infrastructure/Serialization/JsonUdiConverter.cs diff --git a/src/Umbraco.Cms.Api.Management/Serialization/ConfigureUmbracoBackofficeJsonOptions.cs b/src/Umbraco.Cms.Api.Management/Serialization/ConfigureUmbracoBackofficeJsonOptions.cs index e8198fed62..7e30203d86 100644 --- a/src/Umbraco.Cms.Api.Management/Serialization/ConfigureUmbracoBackofficeJsonOptions.cs +++ b/src/Umbraco.Cms.Api.Management/Serialization/ConfigureUmbracoBackofficeJsonOptions.cs @@ -30,6 +30,8 @@ public class ConfigureUmbracoBackofficeJsonOptions : IConfigureNamedOptions +{ + public override GuidUdi? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var stringValue = reader.GetString(); + return stringValue.IsNullOrWhiteSpace() == false && UdiParser.TryParse(stringValue, out Udi? udi) && udi is GuidUdi guidUdi + ? guidUdi + : null; + } + + public override void Write(Utf8JsonWriter writer, GuidUdi value, JsonSerializerOptions options) + => writer.WriteStringValue(value.ToString()); +} diff --git a/src/Umbraco.Infrastructure/Serialization/JsonUdiConverter.cs b/src/Umbraco.Infrastructure/Serialization/JsonUdiConverter.cs new file mode 100644 index 0000000000..e229828b51 --- /dev/null +++ b/src/Umbraco.Infrastructure/Serialization/JsonUdiConverter.cs @@ -0,0 +1,20 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using Umbraco.Cms.Core; +using Umbraco.Extensions; + +namespace Umbraco.Cms.Infrastructure.Serialization; + +public class JsonUdiConverter : JsonConverter +{ + public override Udi? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var stringValue = reader.GetString(); + return stringValue.IsNullOrWhiteSpace() == false && UdiParser.TryParse(stringValue, out Udi? udi) + ? udi + : null; + } + + public override void Write(Utf8JsonWriter writer, Udi value, JsonSerializerOptions options) + => writer.WriteStringValue(value.ToString()); +} diff --git a/src/Umbraco.Infrastructure/Serialization/SystemTextJsonSerializer.cs b/src/Umbraco.Infrastructure/Serialization/SystemTextJsonSerializer.cs index 17a4e0fc1a..cff63cf552 100644 --- a/src/Umbraco.Infrastructure/Serialization/SystemTextJsonSerializer.cs +++ b/src/Umbraco.Infrastructure/Serialization/SystemTextJsonSerializer.cs @@ -12,6 +12,8 @@ public class SystemTextJsonSerializer : IJsonSerializer { _jsonSerializerOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }; _jsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); + _jsonSerializerOptions.Converters.Add(new JsonUdiConverter()); + _jsonSerializerOptions.Converters.Add(new JsonGuidUdiConverter()); // we may need to add JsonObjectConverter at some point, but for the time being things work fine without // _jsonSerializerOptions.Converters.Add(new JsonObjectConverter()); }