.netcore3.0 的json格式化不再默認(rèn)使用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"} 服務(wù)端會報(bào)錯 無法解析字符串為DateTime類型鲁驶,
這時候就需要增加類型轉(zhuǎn)換的處理方式
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ī)定輸入轉(zhuǎn)換的方式和輸出格式化的方法就行了痛侍。
在 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);
這個時候再請求接口朝氓,就能正常轉(zhuǎn)換日期類型了,
同樣返回日期格式不是在 日期和時間中間有個 “T” 了主届,而是 yyyy-MM-dd HH:mm:ss正常的格式了赵哲。