using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Infrastructure.Converter
{
public class JsonConverterUtil
{
///
/// 你提供的转换器是针对单个 DateTime 或 DateTime? 的,而日期数组是一个集合类型(如 DateTime[] 或 List)。JSON 转换器需要明确知道如何处理集合中的每个元素。
///
public class DateTimeNullConverter : JsonConverter
{
//该方法用于将 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
{
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>
{
public override IEnumerable Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.StartArray)
{
var list = new List();
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 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;
}
}
}
}