ASP.NET核心控制器序列化DateTime而不带时间



当没有时间部分时,我想将DateTime的输出格式化为yyyy-MM-ddI.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

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

但我希望它像yyyy-MM-dd一样,时间部分不在那里:

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

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

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

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

感谢

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

//...
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"));
}
}
}
}

最新更新