Files
kunshan-bzfm-mes-backend/Infrastructure/Converter/JsonConverterUtil.cs

88 lines
3.9 KiB
C#
Raw Normal View History

2024-11-28 13:36:05 +08:00
using System;
2025-02-19 10:00:48 +08:00
using System.Collections.Generic;
2024-11-28 13:36:05 +08:00
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Infrastructure.Converter
{
public class JsonConverterUtil
{
2025-02-19 10:00:48 +08:00
/// <summary>
/// 你提供的转换器是针对单个 DateTime 或 DateTime? 的,而日期数组是一个集合类型(如 DateTime[] 或 List<DateTime>。JSON 转换器需要明确知道如何处理集合中的每个元素。
/// </summary>
2024-11-28 13:36:05 +08:00
public class DateTimeNullConverter : JsonConverter<DateTime?>
{
2025-02-21 13:04:44 +08:00
//该方法用于将 JSON 字符串反序列化为 DateTime? 类型的值。
2024-11-28 13:36:05 +08:00
public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> string.IsNullOrEmpty(reader.GetString()) ? default : ParseDateTime(reader.GetString());
2025-02-21 13:04:44 +08:00
//方法用于将 DateTime? 类型的值序列化为 JSON 字符串
2024-11-28 13:36:05 +08:00
public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
2025-02-19 13:37:58 +08:00
=> writer.WriteStringValue(value?.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
2024-11-28 13:36:05 +08:00
}
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)
2025-02-19 13:37:58 +08:00
=> writer.WriteStringValue(value.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
2024-11-28 13:36:05 +08:00
}
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))
2025-02-19 13:37:58 +08:00
return dateVal.ToLocalTime();
2024-11-28 13:36:05 +08:00
return null;
}
2025-02-19 09:45:07 +08:00
2025-02-19 10:00:48 +08:00
//******************************DOAN JSON 转换器处理日期数组****************************************
2025-02-21 13:04:44 +08:00
public class DateTimeArrayConverter : JsonConverter<IEnumerable<DateTime>>
2025-02-19 09:45:07 +08:00
{
2025-02-21 13:04:44 +08:00
public override IEnumerable<DateTime> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
2025-02-19 09:45:07 +08:00
{
2025-02-21 13:04:44 +08:00
if (reader.TokenType == JsonTokenType.StartArray)
2025-02-19 09:45:07 +08:00
{
2025-02-21 13:04:44 +08:00
var list = new List<DateTime>();
while (reader.Read() && reader.TokenType != JsonTokenType.EndArray)
2025-02-19 09:45:07 +08:00
{
2025-02-21 13:04:44 +08:00
if (reader.TokenType == JsonTokenType.String)
2025-02-19 10:00:48 +08:00
{
2025-02-21 13:04:44 +08:00
var dateTime = ParseDateTime(reader.GetString());
if (dateTime != null)
{
list.Add(dateTime.Value.ToLocalTime()); // 将UTC时间转为本地时间
}
2025-02-19 10:00:48 +08:00
}
}
2025-02-21 13:04:44 +08:00
return list;
2025-02-19 10:00:48 +08:00
}
2025-02-21 13:04:44 +08:00
throw new JsonException();
2025-02-19 10:00:48 +08:00
}
2025-02-21 13:04:44 +08:00
public override void Write(Utf8JsonWriter writer, IEnumerable<DateTime> value, JsonSerializerOptions options)
2025-02-19 10:00:48 +08:00
{
writer.WriteStartArray();
foreach (var date in value)
{
2025-02-21 13:04:44 +08:00
writer.WriteStringValue(date.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
2025-02-19 10:00:48 +08:00
}
writer.WriteEndArray();
}
2025-02-21 13:04:44 +08:00
private static DateTime? ParseDateTime(string dateStr)
{
if (!string.IsNullOrEmpty(dateStr) && DateTime.TryParse(dateStr, out var dateVal))
{
return dateVal; // 假设输入的已经是UTC时间
}
return null;
}
2025-02-19 10:00:48 +08:00
}
2024-11-28 13:36:05 +08:00
}
}