即便後來出現眾多標榜速度的 .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

Post a comment