Files
kunshan-bzfm-mes-backend/Infrastructure/Converter/JsonConverterUtil.cs
2025-02-19 10:00:48 +08:00

124 lines
4.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?>
{
public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> string.IsNullOrEmpty(reader.GetString()) ? default : ParseDateTime(reader.GetString());
public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
=> writer.WriteStringValue(value?.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.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;
return null;
}
//******************************DOAN JSON 转换器处理日期数组****************************************
public class DateTimeArrayConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
if (DateTime.TryParse(reader.GetString(), out var date))
{
return date;
}
}
throw new JsonException("Invalid date format");
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.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))
{
dates.Add(null);
}
else if (DateTime.TryParse(dateString, out var date))
{
dates.Add(date);
}
else
{
throw new JsonException($"Invalid date format: {dateString}");
}
}
else
{
throw new JsonException("Expected string value in array.");
}
}
throw new JsonException("Unexpected end of JSON.");
}
public override void Write(Utf8JsonWriter writer, DateTime?[] value, JsonSerializerOptions options)
{
writer.WriteStartArray();
foreach (var date in value)
{
if (date.HasValue)
{
writer.WriteStringValue(date.Value.ToString("yyyy-MM-dd HH:mm:ss"));
}
else
{
writer.WriteNullValue();
}
}
writer.WriteEndArray();
}
}
}
}