ASP.NET Core Web API設定響應輸出的Json資料格式的兩種方式

追逐時光者發表於2023-11-27

前言

在ASP.NET Core Web API中設定響應輸出Json資料格式有兩種方式,可以透過新增System.Text.JsonNewtonsoft.JsonJSON序列化和反序列化庫在應用程式中全域性設定介面響應的Json資料格式,本文示例使用的是新的Minimal API模式。

JSON序列化和反序列化庫

System.Text.Json

System.Text.Json是 .NET Core 3.0 及以上版本中內建的 JSON 序列化和反序列化庫。

Newtonsoft.Json

Newtonsoft.Json是一個功能強大且靈活的.NET JSON序列化和反序列化庫,用於在.NET應用程式中處理JSON資料。

設定Json統一格式需求

  1. 修改屬性名稱的序列化方式,在.Net Core中預設使用小駝峰序列化Json屬性引數,前端想要使用與後端模型本身命名格式輸出(如:UserName)。
  2. 日期型別預設格式化處理,設定為:yyyy-MM-dd HH:mm:ss。

未配置之前的API輸出Json資料

UserInfoModel

    public class UserInfoModel
    {
        public DateTime DateTime { get; set; }

        public int NumberIndex { get; set; }

        public string UserName { get; set; }
    }

UserInfoController

    [ApiController]
    [Route("[controller]")]
    public class UserInfoController : ControllerBase
    {
        private static readonly string[] NameList = new[] { "追逐時光者", "小明同學", "DotNetGuide", "小藝同學", "Edwin" };


        [HttpGet(Name = "GetUserInfo")]
        public IEnumerable<UserInfoModel> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new UserInfoModel
            {
                DateTime = DateTime.Now.AddDays(index),
                NumberIndex = Random.Shared.Next(-20, 55),
                UserName = NameList[Random.Shared.Next(NameList.Length)]
            }).ToArray();
        }
    }

輸出Json資料

System.Text.Json程式全域性配置

新增自定義時間輸出格式類(DateTimeJsonConverter)

    public class DateTimeJsonConverter : 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"));
        }
    }

在Program.cs中全域性配置

            builder.Services.AddControllers().AddJsonOptions(options =>
            {
                //命名規則,該值指定用於將物件上的屬性名稱轉換為另一種格式(例如駝峰大小寫)或為空以保持屬性名稱不變的策略[前端想要使用與後端模型本身命名格式輸出]。
                options.JsonSerializerOptions.PropertyNamingPolicy = null;

                //自定義輸出的時間格式
                options.JsonSerializerOptions.Converters.Add(new DateTimeJsonConverter());
            });

配置後輸出的Json資料

Newtonsoft.Json程式全域性配置

說明

在.NET 3.0及其以上的版本使用Newtonsoft.Json需要透過安裝 Microsoft.AspNetCore.Mvc.NewtonsoftJson 包來進行配置(注意假如提示該包安裝失敗可以嘗試安裝其他版本的包)。

在Program.cs中全域性配置

            builder.Services.AddControllers().AddNewtonsoftJson(options =>
            {
                //修改屬性名稱的序列化方式[前端想要使用與後端模型本身命名格式輸出]
                options.SerializerSettings.ContractResolver = null;

                //方式1:日期型別預設格式化處理 
                options.SerializerSettings.Converters.Add(new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" });
                //方式2:日期型別預設格式化處理 
                //options.SerializerSettings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
                //options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
            });

配置後輸出的Json資料

DotNetGuide技術社群交流群

  • DotNetGuide技術社群是一個面向.NET開發者的開源技術社群,旨在為開發者們提供全面的C#/.NET/.NET Core相關學習資料、技術分享和諮詢、專案推薦、招聘資訊和解決問題的平臺。
  • 在這個社群中,開發者們可以分享自己的技術文章、專案經驗、遇到的疑難技術問題以及解決方案,並且還有機會結識志同道合的開發者。
  • 我們致力於構建一個積極向上、和諧友善的.NET技術交流平臺,為廣大.NET開發者帶來更多的價值和成長機會。

歡迎加入DotNetGuide技術社群微信交流群?

參考文章

相關文章