diff --git a/DOAN.Admin.WebApi/Program.cs b/DOAN.Admin.WebApi/Program.cs index 4a87145..37e756e 100644 --- a/DOAN.Admin.WebApi/Program.cs +++ b/DOAN.Admin.WebApi/Program.cs @@ -13,6 +13,7 @@ using DOAN.Infrastructure.WebExtensions; using DOAN.ServiceCore.Signalr; using DOAN.ServiceCore.SqlSugar; using Microsoft.Extensions.FileProviders; +using static Infrastructure.Converter.JsonConverterUtil; var builder = WebApplication.CreateBuilder(args); // NLog: Setup NLog for Dependency injection @@ -71,7 +72,8 @@ builder.Services.AddMvc(options => options.JsonSerializerOptions.WriteIndented = true; options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeConverter()); options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeNullConverter()); - options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeArrayConverter()); + options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeArrayConverter()); + options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeNullableArrayConverter()); options.JsonSerializerOptions.Converters.Add(new StringConverter()); //PropertyNamingPolicy属性用于前端传过来的属性的格式策略,目前内置的仅有一种策略CamelCase options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; diff --git a/Infrastructure/Converter/JsonConverterUtil.cs b/Infrastructure/Converter/JsonConverterUtil.cs index 95a7dfc..caf4bf8 100644 --- a/Infrastructure/Converter/JsonConverterUtil.cs +++ b/Infrastructure/Converter/JsonConverterUtil.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; @@ -6,6 +7,9 @@ namespace Infrastructure.Converter { public class JsonConverterUtil { + /// + /// 你提供的转换器是针对单个 DateTime 或 DateTime? 的,而日期数组是一个集合类型(如 DateTime[] 或 List)。JSON 转换器需要明确知道如何处理集合中的每个元素。 + /// public class DateTimeNullConverter : JsonConverter { public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) @@ -34,7 +38,7 @@ namespace Infrastructure.Converter return null; } - //******************************DOAN**************************************** + //******************************DOAN JSON 转换器处理日期数组**************************************** public class DateTimeArrayConverter : JsonConverter { public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) @@ -54,5 +58,66 @@ namespace Infrastructure.Converter writer.WriteStringValue(value.ToString("yyyy-MM-ddTHH:mm:ss")); } } + + public class DateTimeNullableArrayConverter : JsonConverter + { + public override DateTime?[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType != JsonTokenType.StartArray) + { + throw new JsonException("Expected start of array."); + } + + var dates = new List(); + + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.EndArray) + { + return dates.ToArray(); + } + + if (reader.TokenType == JsonTokenType.String) + { + var dateString = reader.GetString(); + if (string.IsNullOrEmpty(dateString)) + { + dates.Add(null); + } + else if (DateTime.TryParse(dateString, out var date)) + { + dates.Add(date); + } + else + { + throw new JsonException($"Invalid date format: {dateString}"); + } + } + else + { + throw new JsonException("Expected string value in array."); + } + } + + throw new JsonException("Unexpected end of JSON."); + } + + public override void Write(Utf8JsonWriter writer, DateTime?[] value, JsonSerializerOptions options) + { + writer.WriteStartArray(); + foreach (var date in value) + { + if (date.HasValue) + { + writer.WriteStringValue(date.Value.ToString("yyyy-MM-dd HH:mm:ss")); + } + else + { + writer.WriteNullValue(); + } + } + writer.WriteEndArray(); + } + } } }