88 lines
3.9 KiB
C#
88 lines
3.9 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Text.Json;
|
||
using System.Text.Json.Serialization;
|
||
|
||
namespace Infrastructure.Converter
|
||
{
|
||
public class JsonConverterUtil
|
||
{
|
||
/// <summary>
|
||
/// 你提供的转换器是针对单个 DateTime 或 DateTime? 的,而日期数组是一个集合类型(如 DateTime[] 或 List<DateTime>)。JSON 转换器需要明确知道如何处理集合中的每个元素。
|
||
/// </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"));
|
||
}
|
||
|
||
public class DateTimeConverter : JsonConverter<DateTime>
|
||
{
|
||
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||
{
|
||
var dateTime = ParseDateTime(reader.GetString());
|
||
return dateTime == null ? DateTime.MinValue : dateTime.Value;
|
||
}
|
||
|
||
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
|
||
=> writer.WriteStringValue(value.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
|
||
}
|
||
|
||
public static DateTime? ParseDateTime(string dateStr)
|
||
{
|
||
if (System.Text.RegularExpressions.Regex.IsMatch(dateStr, @"^\d{4}[/-]") && DateTime.TryParse(dateStr, null, System.Globalization.DateTimeStyles.AssumeLocal, out var dateVal))
|
||
return dateVal.ToLocalTime();
|
||
return null;
|
||
}
|
||
|
||
//******************************DOAN JSON 转换器处理日期数组****************************************
|
||
public class DateTimeArrayConverter : JsonConverter<IEnumerable<DateTime>>
|
||
{
|
||
public override IEnumerable<DateTime> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||
{
|
||
if (reader.TokenType == JsonTokenType.StartArray)
|
||
{
|
||
var list = new List<DateTime>();
|
||
while (reader.Read() && reader.TokenType != JsonTokenType.EndArray)
|
||
{
|
||
if (reader.TokenType == JsonTokenType.String)
|
||
{
|
||
var dateTime = ParseDateTime(reader.GetString());
|
||
if (dateTime != null)
|
||
{
|
||
list.Add(dateTime.Value.ToLocalTime()); // 将UTC时间转为本地时间
|
||
}
|
||
}
|
||
}
|
||
return list;
|
||
}
|
||
throw new JsonException();
|
||
}
|
||
|
||
public override void Write(Utf8JsonWriter writer, IEnumerable<DateTime> value, JsonSerializerOptions options)
|
||
{
|
||
writer.WriteStartArray();
|
||
foreach (var date in value)
|
||
{
|
||
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;
|
||
}
|
||
}
|
||
}
|
||
}
|