.Net6去掉返回时间中的T

520 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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);
        }