【问题标题】:ASP.NET core controller serialize DateTime without timeASP.NET核心控制器无时间序列化DateTime
【发布时间】:2021-12-28 21:58:11
【问题描述】:

当没有时间部分时,我想将DateTime 的输出格式化为yyyy-MM-dd i.s.o。 yyyy-MM-ddT00:00:00 在我的情况下默认。

控制器 API 是:

[HttpGet("date")]
public async Task<DateTime> GetDateAsync(Date)
{
    // dummy code
    return DateTime.Now.Date;
}

在 Swagger 中,输出被视为yyyy-MM-ddT00:00:00

我想这是由于 internal const string DefaultDateFormatString = @"yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; in Newtonsoft.Json.JsonSerializerSettings

但我希望它像 yyyy-MM-dd 那样没有时间部分:

if (value is DateTime d) 
{
    if (d.TotalSeconds == 0) 
    {
        writer.WriteValue(d.ToString("yyyy-MM-dd"));
    }
}

所以我想知道如何在上述条件下自定义序列化,然后在启动时进行配置。

这仅适用于控制器的数据输出。

我正在使用ASP.NET 3.1 并使用Newtonsoft.Json

谢谢

【问题讨论】:

  • 如果您使用的是 .NET 6,请使用 DateOnly 而不是 DateTime
  • 您使用的是什么版本的 asp.net core?什么是序列化程序(newtonsoft 或 system.text.json)?
  • 如果您需要帮助,您必须发布整个操作
  • 试试 writer.WriteValue(d.Date.ToString("o"));它将产生 yyyy-MM-ddT00:00:00
  • 我尝试使用 DateOnly,但它没有被序列化为我想要的 2021-12-29 之类的字符串。它提供结构的 JSON 表示。我是否需要在启动时连接一个序列化器,它将所有 DateOnly 类型从任何控制器转换为上述字符串格式? @大卫G

标签: c# .net-core


【解决方案1】:

我创建了一个转换器并在启动时将其连接起来:

//...
AddNewtonsoftJson(options =>
            {
                options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
                options.SerializerSettings.Converters.Add(new JsonDateOnlyConverter());
            })



public class JsonDateOnlyConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(DateTime)  || objectType == typeof(DateTime?));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var token = JToken.Load(reader);
        var t = token.ToString();
        if (token.Type == JTokenType.Date )
        {
            return token.ToObject<DateTime>();
        }
        if (token.Type == JTokenType.String)
        {

            if (string.IsNullOrEmpty(t) || string.IsNullOrWhiteSpace(t))
            {
                return null;
            }

            if (DateTime.TryParse(t, out var val))
            {
                return val;
            }
        }
        if (token.Type == JTokenType.Null && (objectType == typeof(DateTime?) || objectType == typeof(DateTime)))
        {
            return null;
        }
        throw new JsonSerializationException("Unexpected token type: " + t);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value is DateTime d)
        {
            if (d.Date.Ticks == d.Ticks)
            {
                writer.WriteValue(d.ToString("yyyy-MM-dd"));
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-29
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2019-02-02
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多