ASP.NET Core 教學 - Web API JSON 序列化設定

-- Pageviews

Camel

用 JSON 作為 Web API 資料傳遞格式,並使用 camelCase 作為名稱命名規則,幾乎已成為通用的標準。ASP.NET Core Web API 也很貼心的把回傳物件格式預設為 JSON camelCase。

通常 C# 端定義的物件欄位都是 PascalCase,但有時候為了讓前端 JavaScript 物件可以跟後端保持一致,也會把前端 JavaScript 物件欄位定義成 PascalCase 格式。

為了讓前後端定義的物件欄位格式保持一致,就可以透過 SerializerSettings 改變收送格式。

Define Web API

假設我們有一個 Web API 回傳 ContactModel 物件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class ContactModel
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
public string Address { get; set; }
}

[HttpGet]
public ContactModel Get()
{
return new ContactModel
{
Id = 1,
FirstName = "John",
LastName = "Wu"
};
}

Camel Case

Startup.cs

1
2
3
4
5
6
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// 或者以下寫法
// services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver());
}

呼叫 Web API 會回傳 JSON 如下:

1
2
3
4
5
6
7
8
{
"id": 1,
"firstName": "John",
"lastName": "Wu",
"email": null,
"phoneNumber": null,
"address": null
}

Pascal Case

Startup.cs

1
2
3
4
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
}

呼叫 Web API 會回傳 JSON 如下:

1
2
3
4
5
6
7
8
{
"Id": 1,
"FirstName": "John",
"LastName": "Wu",
"Email": null,
"PhoneNumber": null,
"Address": null
}

Ignore Null

上述兩個 JSON 回傳,都帶有 null 的欄位。在轉型的過程,找不到欄位會自動轉成 null,傳送的過程忽略掉也沒差,反而可以節省到一點流量。

Startup.cs

1
2
3
4
5
6
7
8
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddJsonOptions(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
});
}

呼叫 Web API 會回傳 JSON 如下:

1
2
3
4
5
{
"Id": 1,
"FirstName": "John",
"LastName": "Wu",
}