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; } //解決!
}