首页 新闻 会员 周边 捐助

asp.net core 3.0 json日期格式化的问题

0
[已解决问题] 解决于 2019-08-09 16:00

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日期格式?

大豆男生的主页 大豆男生 | 小虾三级 | 园豆:608
提问于:2019-08-09 15:17
< >
分享
最佳答案
0

解决了:

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

大豆男生 | 小虾三级 |园豆:608 | 2019-08-09 15:58
其他回答(2)
1

但是这么改就失去了3.0一个新特性了
放弃了使用NewtonsoftJson作为默认Json序列化工具
新组件是System.Text.Json,性能会高不少
但是这个我也确实没找到怎么自定义序列化

源Code | 园豆:206 (菜鸟二级) | 2019-08-11 16:40

的确,但目前 .AddJsonOptions(optioins => { optioins.JsonSerializerOptions.xxx}) 不知道怎么写才可以自定义日期格式

支持(0) 反对(0) 大豆男生 | 园豆:608 (小虾三级) | 2019-08-12 10:58
2

.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);

丶亡我之心不死 | 园豆:202 (菜鸟二级) | 2019-10-06 17:21

这里只考虑了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());

支持(4) 反对(0) 丶亡我之心不死 | 园豆:202 (菜鸟二级) | 2019-10-06 17:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册