C# JSON

使用 JsonProperty 設定類別屬性的別名

陳光堯 2018/12/31 15:37:18
10358

使用 JsonProperty 設定類別屬性的別名


簡介

在做資料串接的 API 時,有時會遇到欄位規格名稱不符合本身程式語言的命名規範,這時可以使用 JsonProperty,可以將類別屬性另外設定別名。

作者

陳光堯


在開發的過程中,有時需要與異質系統做資料串接的 API,因此在設計 Request Model 時,需要設計與對方欄位名稱一致才能對接的起來,但有時對方系統,例如 AS400 系統,欄位可能會命名成 COL-PROD-ID 這種中間用「-」做為單字區分,但這種命名方式在 C#Java 語言中是會被判讀錯誤的,如下圖:
 
 
程式會判讀錯誤
 
所以沒辦法直接命名成對方所設計的欄位名稱,也許可以建議對方改欄位名稱,例如: COL_PROD_IDCOL_PROD_NAME,這種在 C# 專案是合法的命名,但對方可能還會有其他系統對接的考量,可能沒辦法配合我們做單一專案的修改,因此難道就沒有其他的方法嗎? 其實 C# 語言提供了一種方法,可以讓我們將屬性序列化成另一個名稱,那就是接下來要介紹的 JsonProperty 屬性註解
 

接下來介紹如何使用 JsonProperty 屬性註解。假設對方要求的欄位規格如下:

欄位名稱

欄位型態

COL-PROD-ID

string

COL-PROD-NAME

string

COL-PRICE

int

COL-AMOUNT

int

 
我們可以根據以上的規格設計類別 (class),當然要取合法的屬性名稱,如下圖:
 
 
類別定義
 
然後在程式一開始引入 Newtonsoft.Json 命名空間,
 
 
引入命名空間
 
接著在此類別中每個屬性前加入屬性註解 JsonProperty,例如在 COL_PROD_ID 屬性前加上: JsonProperty(PropertyName = "COL-PROD-ID"),其中 PropertyName 是設定此屬性的別名 (alias),在這裡當然要取成對方給我們的欄位名稱: COL-PROD-ID,如下圖:
 
 
可以取屬性的別名
 
整個完成應該要是以下這樣,
 
完整的類別定義
 

因為 PropertyName 是字串型態,所以不會受限於 C# 的命名規範,當然也就可以將屬性另外設定成我們想要的名稱。

 

若使用 Postman 觀察 API 串接的情形,可以發現類別序列化成 JSON 格式後的屬性名稱就是 PropertyName 設定的名稱,如下圖:
 
JSON格式
 
如此一來,就可以跟對方系統做資料串接的動作,而不會受限於本身程式語言的命名規範。
 
陳光堯