只有累積,沒有奇蹟

2019年5月28日 星期二

[NETCore] ASP.NET Core 設定 JSON 序列化格式

前言
JSON.NET 是十分好用的套件,在 ASP.NET Core 1.0 開始內建 JSON.NET方便開發者快速使用,建立 ASP.NET Core 範本專案時會在  ConfigureServices  中的 addMVC 就可以開始使用,這篇介紹如何在 ASP.NET Core 中定義 JSON.NET 統一輸出格式的設定,若有問題歡迎留言一起討論。

範例代碼
首先建立 ASP.NET Core Web App 專案,使用範本專案中有的預設 Value Controller 並將其進行修改,將 Get 與 Get(id) API 修改為自訂的 UserInfo,下
[HttpGet]
public ActionResult<UserInfo> Get()
{
    return new UserInfo()
    {
        Name = "Marcus",
        LoginTime = DateTime.Now.ToString(CultureInfo.CurrentCulture)
    };
}

[HttpGet("{id}")]
public ActionResult<Dictionary<string, string>> Get(int id)
{
    return new Dictionary<string, string>
    {
        { "Name", "Marcus" },
        { "LoginTime", DateTime.Now.ToString(CultureInfo.CurrentCulture) }
    };
}

public class UserInfo
{
    public string Name { get; set; }
    public string LoginTime { get; set; }
}
使用 Get 方法會回傳下列內容
{
    "name": "Marcus",
    "loginTime": "2019/5/29 下午 09:26:51"
}
另一個接口 Get 帶參數 id 的接口,使用自訂的 Dictionary 回傳內容
{
    "Name": "Marcus",
    "LoginTime": "2019/5/29 下午 09:35:19"
}
可以發現 Get 與 Get (id) 回傳的 Json 內容有些微差異,原因是因為在 ASP.NET Core 中回傳的 Json 元素預設會使用 駝峰式大小寫 (PascalCase) 中的 小駝峰式命名法,也就是第一個單字開頭會小寫,第二個單字為大寫,如果希望回傳的統一固定格式的話,可以在 ConfigureServices 加入  addJsonOptions  進行調整,在 MvcJsonOptions 中提供兩種方法 UseCamelCasing 與 UseMemberCasing 來設定 JSON 序列化的大小寫行為

設定方式
預設小寫 - Camel Case
在 AddJsonOptions 中提供 UseCamelCasing 方法設定輸出格式,帶統一為小寫,設定方式如下
services.AddMvc()
    .AddJsonOptions(opt => opt.UseCamelCasing(true));
在重新執行一次 Get(id) API 原本輸出為大寫,調整設定之後就會變為小寫
{
    "name": "Marcus",
    "loginTime": "2019/5/29 下午 22:26:51"
}

預設大寫 - Pascal Case
在 AddJsonOptions 中使用 DefaultContractResolver 方法設定統一為大寫,設定方式如下
services.AddMvc()
    .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
在重新執行一次 Get(id) API 輸出調整設定之後就會統一變為大寫
{
    "Name": "Marcus",
    "LoginTime": "2019/5/29 下午 23:16:11"
}


Json.Net
JSON.NET 從 ASP.NET Core 中就存在,但從 ASP.NET Core 3.0 開始將不會在內建 JSON.NET,會提供一組新的 Json API 提供給開發者使用,命名空間為 System.Text.Json,詳細細節可以參考 Announcing .NET Core 3.0 Preview 5 ,日後若有機會也會試試看 :)


參考

0 意見:

張貼留言

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com