Json.Net進行序列化物件後的屬性更名(或者反序列化時期的名稱對齊)

前陣子在網路上看到某程式設計師為了要讓輸出JSON的屬性符合他想要的定義,進而採用C#的關鍵字當作屬性名稱的爭議,覺得這事情有這麼固執嗎?隨便翻了一下JOSN.NET,果然這種想像中的事情人家早就支援了。

利用JsonPropertyAttribute來輕鬆完成

Step 1. 假設有一個ORM物件如下,但我們不滿意他將被輸出JSON格式的屬性名稱,因此建立屬性描述如下:

public class ORM
{
  [JsonProperty("cAliasName")]
  public string cName { get; set; }
  [JsonProperty("iAliasMoney")]
  public int iMoney { get; set; }
}

Step 2. 回到Main Console測試一下:

ORM oTest = new ORM() { cName = "john", iMoney = 99999 };
Console.WriteLine(JsonConvert.SerializeObject(oTest, Formatting.Indented));

當ORM類別沒有附掛JsonProperty屬性時輸出:

{
  "cName": "john",
  "iMoney": 99999
}

當ORM類別附掛JsonProperty屬性時輸出:

{
  "cAliasName": "john",
  "iAliasMoney": 99999
}

最後想對那位不知名的程式設計師說:「施主!何苦執著啊~轉個念頭豈不輕鬆乎?」就算退後一萬步沒有JsonPropertyAttribute,宣告個匿名型別(AnonymousType)包皮後在網外丟不也到達一樣的效果嗎?

反序列化時期的名稱對齊

JsonProperty還有另外一個功用,就是序列化時期的名稱對齊,例如有一個別人給你的JSON,偏偏就是要這樣命名:

{
  "My-Name": "John"
}

這種命名方式在很多語言中均不符合變數命名規則,關鍵就出在這個減法的符號-。以C#為例子,你沒有辦法設計一個ORM來讓後續的JSON.NET反序列化,自動賦值到該物件身上。例如:

public class ORM
{
  public string My-Name { get; set; }  //不合法的屬性命名規則
}

這時候我們可以改成這樣,在反序列化時期就可達成自動賦值:

public class ORM
{
  [JsonProperty("My-Name")]
  public string MyName { get; set; }  //解決!
}

相關參考

Newtonsoft.Json JsonConvert.SerializeObject ClassProperty ORMProperties JSON ChangePropertyName ModifyPropertiesName