Files
kunshan-bzfm-mes-backend/Infrastructure/Converter/JsonConverterUtil.cs
qianhao.xu 218a1ce86a 1
2025-02-21 13:04:44 +08:00

88 lines
3.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}
}