同事有個小需求,已知城市、區域及郵遞區號要產生如下規格的 JSON 餵到前端:
{
"rows": {
"row": [
{
"City": "台北市",
"Area": "文山區",
"ZIP": "116"
}
]
}
}
先前介紹過 JObject 結合 dynamic 的花式玩法可以快速達成目標:
staticvoid TestJObject(string city, string area, string zip)
{
dynamic root = new JObject();
root.rows = new JObject();
dynamic row = new JObject();
row.City = city;
row.Area = area;
row.ZIP = zip;
root.rows.row = new JArray(row);
Console.WriteLine(JsonConvert.SerializeObject(root, Formatting.Indented));
}
不過,我認為這個案例用 JObject 有點殺雞用牛刀,用 C# 匿名型別可以更輕鬆搞定,就順手寫了範例。從同事驚嘆的反應,我猜應該有些朋友沒想過匿名型別可以這様玩,看來這技巧有分享的價值,那就野人獻曝一下好了。
程式碼說破就不值一文錢,new { PropName = PropValue… } 直接宣告匿名物件,new [] { } 可宣告匿名物件陣列,將物件用 JsonConvert.SerializeObject() 轉成 JSON,大功告成!
staticvoid TestAnonyType(string city, string area, string zip)
{
var root = new
{
rows = new
{
row = new[]
{
new
{
City = city,
Area = area,
ZIP = zip
}
}
}
};
Console.WriteLine(JsonConvert.SerializeObject(root, Formatting.Indented));
}
}
實測兩種寫法結果一致:
staticvoid Main(string[] args)
{
TestJObject("台北市", "文山區", "116");
TestAnonyType("台北市", "文山區", "116");
Console.ReadLine();
}
雜耍表演完畢,下台一鞠躬~