一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情。 由于一系列的规则,.Net中返回的时间序列化后都带有T,最近项目升级到.NET6了,返回数据中仍然有T!记录一下升级解决方案!
- 注意在.Net6之前序列化一般使用Newtonsoft.Json 升级后采用 System.Text.Json 。
- 原以为按照.Net5中的方案,在Program中配置一下就可以了,试了一下发现姿势不对,首先.Net6现在默认不需要AddMvc()配置了,我们就不能使用
builder.Services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest).AddJsonOptions(option =>
这种方法,而且SetCompatibilityVersion方法也以及被弃用了!
- 并且options也升级为JsonSerializerOptions,而且是只读的,干了尬!
-
尝试了一下,有点难搞,去官网找了一下,果然有升级说明传送门,明确告知了DateTimeFormatString不被支持,但是告诉了如何升级啊!
-
继续传送门
-
看到了底,也没有看出个所以然,最底部有个推荐阅读 如何在 .NET 中编写用于 JSON 序列化(封送)的自定义转换器 这不就是我需要的东西吗?只不过官方举例是用的DateTimeOffsetJsonConverter ,修改为DateTimeJsonConverter就可以了啊! 干他一扳手!
-
新建一个DateTimeJsonConverter类
public class DateTimeJsonConverter : JsonConverter<DateTime>
{
public override DateTime Read(
ref Utf8JsonReader reader,
Type typeToConvert,
JsonSerializerOptions options)
{
return DateTime.ParseExact(reader.GetString(), "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture));
}
}
- 新建一个JsonSerializerOptions对象,添加我们新建的转换器
JsonSerializerOptions serializeOptions = new JsonSerializerOptions
{
WriteIndented = true,
Converters ={ new DateTimeJsonConverter() }
};
-
在返回JsonResult对象时进行调用(我们有多个返回对象,为了方便,我们可以重新一下ControllerBase,这样只需要在重写的BaseController中进行调用就好了)
return new JsonResult(baseResponseEntity, serializeOptions);
- PS 重写控制器示例(控制器中继续BaseController ,调用BaseJsonResult)
public class BaseController : ControllerBase
{
JsonSerializerOptions serializeOptions = new JsonSerializerOptions
{
WriteIndented = true,
Converters ={ new DateTimeJsonConverter() }
};
/// <summary>
/// 返回自定义对象 消息为默认
/// </summary>
/// <param name="result"></param>
/// <param name="sce"></param>
/// <param name="returncode"></param>
/// <returns></returns>
protected JsonResult BaseJsonResult(object result, StateCodeEnum sce)
{
BaseResponseEntity<object> baseResponseEntity = new BaseResponseEntity<object>((int)sce, result, EnumHelper.GetEnumName<StateCodeEnum>((int)sce));
return new JsonResult(baseResponseEntity, serializeOptions);
}
/// <summary>
/// 返回自定义对象
/// </summary>
/// <param name="result"></param>
/// <param name="sce"></param>
/// <param name="msg"></param>
/// <returns></returns>
protected JsonResult BaseJsonResult(object result, StateCodeEnum sce, string msg)
{
BaseResponseEntity<object> baseResponseEntity = new BaseResponseEntity<object>((int)sce, result, msg);
return new JsonResult(baseResponseEntity, serializeOptions);
}