From 773019a5e5b32831f64b4e5598abdf6006343e9d Mon Sep 17 00:00:00 2001 From: MnatsakanMargaryan Date: Tue, 9 Dec 2025 12:03:42 +0400 Subject: [PATCH] new json covnerters added to reduce code reduncancy across projects --- .../JsonConverters/CustomDateOnlyConverter.cs | 25 +++++++++ .../JsonConverters/EnumConverterFactory.cs | 33 ++++++++++++ .../NonNullableEnumConverter.cs | 34 ++++++++++++ .../JsonConverters/NullableEnumConverter.cs | 46 ++++++++++++++++ src/SharedKernel/SharedKernel.csproj | 52 +++++++++---------- 5 files changed, 164 insertions(+), 26 deletions(-) create mode 100644 src/SharedKernel/JsonConverters/CustomDateOnlyConverter.cs create mode 100644 src/SharedKernel/JsonConverters/EnumConverterFactory.cs create mode 100644 src/SharedKernel/JsonConverters/NonNullableEnumConverter.cs create mode 100644 src/SharedKernel/JsonConverters/NullableEnumConverter.cs diff --git a/src/SharedKernel/JsonConverters/CustomDateOnlyConverter.cs b/src/SharedKernel/JsonConverters/CustomDateOnlyConverter.cs new file mode 100644 index 0000000..a1c2159 --- /dev/null +++ b/src/SharedKernel/JsonConverters/CustomDateOnlyConverter.cs @@ -0,0 +1,25 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace SharedKernel.JsonConverters; + +public class CustomDateOnlyConverter : JsonConverter +{ + private const string DateFormat = "dd-MM-yyyy"; + public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var dateString = reader.GetString(); + + if (DateOnly.TryParseExact(dateString, DateFormat, null, System.Globalization.DateTimeStyles.None, out var date)) + { + return date; + } + + throw new JsonException($"Unable to parse date: {dateString}"); + } + + public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString(DateFormat)); + } +} \ No newline at end of file diff --git a/src/SharedKernel/JsonConverters/EnumConverterFactory.cs b/src/SharedKernel/JsonConverters/EnumConverterFactory.cs new file mode 100644 index 0000000..83e5d65 --- /dev/null +++ b/src/SharedKernel/JsonConverters/EnumConverterFactory.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +namespace SharedKernel.JsonConverters; + +public class EnumConverterFactory : JsonConverterFactory +{ + public override bool CanConvert(Type typeToConvert) + { + return typeToConvert.IsEnum || + (Nullable.GetUnderlyingType(typeToConvert)?.IsEnum ?? false); + } + + public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) + { + var underlyingType = Nullable.GetUnderlyingType(typeToConvert); + if (underlyingType != null) // It's a nullable enum + { + Type converterType = typeof(NullableEnumConverter<>).MakeGenericType(underlyingType); + return (JsonConverter)Activator.CreateInstance(converterType)!; + } + else // Non-nullable enum + { + Type converterType = typeof(NonNullableEnumConverter<>).MakeGenericType(typeToConvert); + return (JsonConverter)Activator.CreateInstance(converterType)!; + } + } +} \ No newline at end of file diff --git a/src/SharedKernel/JsonConverters/NonNullableEnumConverter.cs b/src/SharedKernel/JsonConverters/NonNullableEnumConverter.cs new file mode 100644 index 0000000..92061b6 --- /dev/null +++ b/src/SharedKernel/JsonConverters/NonNullableEnumConverter.cs @@ -0,0 +1,34 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace SharedKernel.JsonConverters; + +public class NonNullableEnumConverter : JsonConverter where T : struct, Enum +{ + public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.String) + { + var enumString = reader.GetString(); + if (Enum.TryParse(enumString, true, out T result)) + { + return result; + } + } + else if (reader.TokenType == JsonTokenType.Number) + { + int enumValue = reader.GetInt32(); + if (Enum.IsDefined(typeof(T), enumValue)) + { + return (T)Enum.ToObject(typeof(T), enumValue); + } + } + + throw new JsonException($"Unable to convert value to enum {typeof(T)}"); + } + + public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString()); + } +} \ No newline at end of file diff --git a/src/SharedKernel/JsonConverters/NullableEnumConverter.cs b/src/SharedKernel/JsonConverters/NullableEnumConverter.cs new file mode 100644 index 0000000..74b6f95 --- /dev/null +++ b/src/SharedKernel/JsonConverters/NullableEnumConverter.cs @@ -0,0 +1,46 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace SharedKernel.JsonConverters; + +public class NullableEnumConverter : JsonConverter where T : struct, Enum +{ + public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + + if (reader.TokenType == JsonTokenType.String) + { + var enumString = reader.GetString(); + if (Enum.TryParse(enumString, true, out T result)) + { + return result; + } + } + else if (reader.TokenType == JsonTokenType.Number) + { + int enumValue = reader.GetInt32(); + if (Enum.IsDefined(typeof(T), enumValue)) + { + return (T)Enum.ToObject(typeof(T), enumValue); + } + } + + throw new JsonException($"Unable to convert value to nullable enum {typeof(T)}"); + } + + public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOptions options) + { + if (value.HasValue) + { + writer.WriteStringValue(value.Value.ToString()); + } + else + { + writer.WriteNullValue(); + } + } +} \ No newline at end of file diff --git a/src/SharedKernel/SharedKernel.csproj b/src/SharedKernel/SharedKernel.csproj index db0af5e..c7340aa 100644 --- a/src/SharedKernel/SharedKernel.csproj +++ b/src/SharedKernel/SharedKernel.csproj @@ -8,56 +8,56 @@ Readme.md Pandatech MIT - 1.8.10 + 1.9.0 Pandatech.SharedKernel Pandatech Shared Kernel Library Pandatech, shared kernel, library, OpenAPI, Swagger, utilities, scalar Pandatech.SharedKernel provides centralized configurations, utilities, and extensions for ASP.NET Core projects. For more information refere to readme.md document. https://github.com/PandaTechAM/be-lib-sharedkernel - nuget updates + New json covnerters added to reduce code reduncancy across projects. - - + + - + - - - - - - - - - - - - + + + + + + + + + + + + - + - + - + - - - + + + - - - + + +