Json.NET 範例 - 列舉 JSON 各階層屬性
0 |
即便後來出現眾多標榜速度的 .NET JSON 程式庫,連 .NET Team 也推出自己的版本 System.Text.Json,強調效能翻倍記憶體更省,但 Json.NET 仍是我心中現階段處理 JSON 的不二選擇。
今天遇到一個較少見的需求,有一個 JSON 結構如下:
{
"Name": "Sample",
"Tag": "Root",
"Array": [
{ "Tag": "ArrayElement" }
],
"CustObject": {
"Tag": "SubClass"
}
}
我想挑出其中名為 Tag 的屬性,不管屬性來自根物件、陣列某個物件元素,還是自訂型別屬性物件,只要名稱是 Tag,通通列出來。
遇到這種場合,憑藉 Json.NET 渾然天成的 LINQ 支援,幾行程式便手到擒來,簡潔程度令人驚喜,寫程式就是要這樣寫才叫享受呀!
var json = System.IO.File.ReadAllText("TestData.json");
var jo = JsonConvert.DeserializeObject<JObject>(json);
var dict = jo.Descendants() //取得所有從屬項目
.OfType<JProperty>() //篩選型別為 JProperty 的項目
.Where(o => o.Name == "Tag") //比對屬性名稱
.ToDictionary(o => o.Path, o => o.Value.ToString()); //轉成 Dictionary<string, string>
Console.WriteLine(JsonConvert.SerializeObject(dict, Newtonsoft.Json.Formatting.Indented));
執行結果:
{
"Tag": "Root",
"Array[0].Tag": "ArrayElement",
"CustObject.Tag": "SubClass"
}
Json.NET 好強,LINQ 超酷,叫我如何不愛他?
(上回提過,Json.NET 的作者 James Newton-King 已加入微軟,Json.NET 未來或許會被 System.Text.Json 超越,但我覺得還有很長的路~)
Although there are many faster .NET JSON libraries, Json.NET is still the best choice to me. This example showing how to use Json.NET's LINQ support to explore all properties in a JSON file.
Comments
Be the first to post a comment