This commit is contained in:
qianhao.xu
2025-02-21 13:04:44 +08:00
parent f80aca492c
commit 218a1ce86a
8 changed files with 191 additions and 95 deletions

View File

@@ -12,9 +12,11 @@ namespace Infrastructure.Converter
/// </summary>
public class DateTimeNullConverter : JsonConverter<DateTime?>
{
//该方法用于将 JSON 字符串反序列化为 DateTime? 类型的值。
public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> string.IsNullOrEmpty(reader.GetString()) ? default : ParseDateTime(reader.GetString());
//方法用于将 DateTime? 类型的值序列化为 JSON 字符串
public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
=> writer.WriteStringValue(value?.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
}
@@ -39,85 +41,47 @@ namespace Infrastructure.Converter
}
//******************************DOAN JSON 转换器处理日期数组****************************************
public class DateTimeArrayConverter : JsonConverter<DateTime>
public class DateTimeArrayConverter : JsonConverter<IEnumerable<DateTime>>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
public override IEnumerable<DateTime> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
if (reader.TokenType == JsonTokenType.StartArray)
{
if (DateTime.TryParse(reader.GetString(), out var date))
var list = new List<DateTime>();
while (reader.Read() && reader.TokenType != JsonTokenType.EndArray)
{
return date;
}
}
throw new JsonException("Invalid date format");
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToLocalTime().ToString("yyyy-MM-ddTHH:mm:ss"));
}
}
public class DateTimeNullableArrayConverter : JsonConverter<DateTime?[]>
{
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<DateTime?>();
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndArray)
{
return dates.ToArray();
}
if (reader.TokenType == JsonTokenType.String)
{
var dateString = reader.GetString();
if (string.IsNullOrEmpty(dateString))
if (reader.TokenType == JsonTokenType.String)
{
dates.Add(null);
}
else if (DateTime.TryParse(dateString, out var date))
{
dates.Add(date);
}
else
{
throw new JsonException($"Invalid date format: {dateString}");
var dateTime = ParseDateTime(reader.GetString());
if (dateTime != null)
{
list.Add(dateTime.Value.ToLocalTime()); // 将UTC时间转为本地时间
}
}
}
else
{
throw new JsonException("Expected string value in array.");
}
return list;
}
throw new JsonException("Unexpected end of JSON.");
throw new JsonException();
}
public override void Write(Utf8JsonWriter writer, DateTime?[] value, JsonSerializerOptions options)
public override void Write(Utf8JsonWriter writer, IEnumerable<DateTime> value, JsonSerializerOptions options)
{
writer.WriteStartArray();
foreach (var date in value)
{
if (date.HasValue)
{
writer.WriteStringValue(date.Value.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
}
else
{
writer.WriteNullValue();
}
writer.WriteStringValue(date.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
}
writer.WriteEndArray();
}
private static DateTime? ParseDateTime(string dateStr)
{
if (!string.IsNullOrEmpty(dateStr) && DateTime.TryParse(dateStr, out var dateVal))
{
return dateVal; // 假设输入的已经是UTC时间
}
return null;
}
}
}
}