.netcore3.0 System.Text.Json 日期格式化

.netcore3.0 的json格式化不再默認使用Newtonsoft.Json,而是使用自帶的System.Text.Json來處理。
理由是System.Text.Json 依賴更少,效率更高。

webapi定義的參數(shù)如果是個datetime類型的話 比如

public class Input
{
     public DateTime?Begin{get;set;}
     public DateTime?End{get;set;}
}

webapi的controller中定義的action

public dynamic GetList([FromBody]Input input)
{
   ……
}

這是一個常用的場景

如果請求傳入的 日期格式是 {"begin":"2019-10-12","end":"2019-10-13"} 服務端會報錯 無法解析字符串為DateTime類型,
這時候就需要增加類型轉換的處理方式

public class SystemTextJsonConvert
    {
        public class DateTimeConverter : JsonConverter<DateTime>
        {
            public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
            {
                return DateTime.Parse(reader.GetString());
            }

            public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
            {
                writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss"));
            }
        }

        public class DateTimeNullableConverter : JsonConverter<DateTime?>
        {
            public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
            {
                return string.IsNullOrEmpty(reader.GetString()) ? default(DateTime?) : DateTime.Parse(reader.GetString());
            }

            public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
            {
                writer.WriteStringValue(value?.ToString("yyyy-MM-dd HH:mm:ss"));
            }
        }
    }

JsonConverter中包含 read和write的抽象方法 ,只要重寫這兩個方法,規(guī)定輸入轉換的方式和輸出格式化的方法就行了。

在 setup中增加配置

  services.AddControllers().AddJsonOptions(options =>
            {
                options.JsonSerializerOptions.Converters.Add(new Common.SystemTextJsonConvert.DateTimeConverter());
                options.JsonSerializerOptions.Converters.Add(new Common.SystemTextJsonConvert.DateTimeNullableConverter());
            }).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

這個時候再請求接口,就能正常轉換日期類型了,
同樣返回日期格式不是在 日期和時間中間有個 “T” 了,而是 yyyy-MM-dd HH:mm:ss正常的格式了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容