asp.net core 3.0 json日期格式化的问题:
.net core 2.1中,在Startup.cs 的 ConfigureServices(IServiceCollection services) 里这样写,就可以:
services.AddMvc()
.AddJsonOptions(options => { options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; });
但是,在.net core 3.0中这样写报错。
asp.net core 3.0 怎么自定义json日期格式?
解决了:
(1) Install the Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet package.
(2) In ConfigureServices() add a call to AddNewtonsoftJson()
.AddNewtonsoftJson(options => {options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; } )
但是这么改就失去了3.0一个新特性了
放弃了使用NewtonsoftJson作为默认Json序列化工具
新组件是System.Text.Json,性能会高不少
但是这个我也确实没找到怎么自定义序列化
的确,但目前 .AddJsonOptions(optioins => { optioins.JsonSerializerOptions.xxx}) 不知道怎么写才可以自定义日期格式
.Net Core 3 的System.Text.Json, 设置日期格式代码如下:
public class DateTimeConverter : JsonConverter<DateTime>
{
/// <summary>
/// 获取或设置DateTime格式
/// <para>默认为: yyyy-MM-dd HH:mm:ss</para>
/// </summary>
public string DateTimeFormat { get; set; } = "yyyy-MM-dd HH:mm:ss";
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> DateTime.Parse(reader.GetString());
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
=> writer.WriteStringValue(value.ToString(this.DateTimeFormat));
}
然后再Startup类里面
services.AddControllersWithViews()
.AddJsonOptions(option =>
{
option.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
option.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
})
.SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
这里只考虑了DateTime类型, 如果有可空的DateTime, 则需要再建个类, 继承JsonConverter<DateTime?>.
比如:
public class DateTimeNullConverter : JsonConverter<DateTime?>
{
/// <summary>
/// 获取或设置DateTime格式
/// <para>默认为: yyyy-MM-dd HH:mm:ss</para>
/// </summary>
public string DateTimeFormat { get; set; } = "yyyy-MM-dd HH:mm:ss";
public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> string.IsNullOrEmpty(reader.GetString()) ? default(DateTime?) : DateTime.Parse(reader.GetString());
public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
=> writer.WriteStringValue(value?.ToString(this.DateTimeFormat));
}
然后再Add一次就行
option.JsonSerializerOptions.Converters.Add(new DateTimeNullConverter());