當物件包含Enum屬性被序列化成JSON時,強制輸出Enum名稱

最近遇到一個需求,就是當某API丟出JSON格式的資料時,裡面若具備enum列舉等級的屬性,則該屬性被賦予成JSON的值不可為整數,必須為可識別的文字,例如該項次的ToString()後的字眼。

舉例來說,我們有下列student學生物件與shoes鞋子列舉:

class student
{
  public string cName  { get; set; }
  public shoes  eShose { get; set; }
}

enum shoes
{
  Nike   = 0,
  Reebok = 1,
}

然後我們建立一個資料物件起來:

var oUser = new student()
{
  cName  = "王小明",
  eShose = shoes.Reebok
};

經過Newtonsoft.Json.JsonConvert.SerializeObject(oUser)的序列化後,你應該會得到下列的JSON字串:

{
  "cName": "王小明",
  "eShose": 1
}

接下來我們的問題是,要怎麼讓這個eShose列舉屬性不要以整數(數值)的方式呈現,而是改採以列舉本身的項次文字字串來輸出呢?以這個例子來說,我們想要顯示成下列JSON資料:

{
  "cName": "王小明",
  "eShose": "Reebok"
}

答案出乎意料的簡單,只要在序列化方法的後面加入一個StringEnumConverter()引數即可。

Newtonsoft.Json.JsonConvert.SerializeObject(
  oUser,
  new Newtonsoft.Json.Converters.StringEnumConverter()
)
Newtonsoft Json.Net SerializeObject Enum Int Integer Numeric EnumName EnumString EnumToString()