LINQ to JSON - Json.NET

JSON已經是非常普遍的資料來源了,特別是當你需要透過網路與傳送資料時,將其轉換成為JSON格式會讓整個過程省力許多,在 LINQ 與 JSON這一篇裏面討論了網頁上 JSON 格式資料的 LINQ 搜尋技巧,而現在這一篇很快的來看看伺服器端的部份。

為了簡化說明,這裏使用最簡單的主控台應用程式進行說明,建立一個新的主控台應用程式,於專案總管中,展開參考功能選單如下:


點選「管理 NuGet 套件」開啟設定對話方塊。


在左邊的選單中,選取線上,於右邊的視窗中找到 Json.NET 套件,按一下「安裝」按鈕,進行安裝,最後出現以下的畫面, Json.NET 套件的右上角出現勾選符號,表示順利完成安裝。


參考清單中出現了所參考的套件名稱項目 Newtonsoft.Json:


現在測試 LINQ to JSON 的功能,開啟 Program.cs 這個檔案,首先引用命名空間:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

建立測試用的 JSON 資料,這是一個包含三筆書籍資訊的  JSON 格式字串:

 string bookjson =
      "[{\"title\":\"HTML5完美風暴\",\"pages\":1000,\"author\":\"呂高旭\"},"+
      " {\"title\":\"新世代ASP.NET升級之路\",\"pages\":280,\"author\":\"康廷數位研究室\"}," +
      " {\"title\":\"HTML5從零開始\",\"pages\":650,\"author\":\"呂高旭\"}]";

我們要將這個字串轉換成為對應的  JObject 物件 集合,因此調用 JsonConvert.DeserializeObject() 方法進行轉換:

 List<JObject> books = JsonConvert.DeserializeObject<List<JObject>>(bookjson);

最後得到的 books 是一個支援 LINQ 語法的可列舉 JObject 泛型物件,而原來的字串 bookjson 現在已經轉換成為三筆 JSON 格式資料,利用 LINQ 語法將其取出:

var binfo = from b in books                      
                  select b; 

接下來可以利用迴圈將資料逐項取出,你可以透過數字索引或是欄位名稱指定如下:

            foreach(var b in binfo){
                Console.WriteLine("書名:"+b["title"] );
                Console.WriteLine("頁數:" + b["pages"]);
                Console.WriteLine("作者:" + b["author"]);
                Console.WriteLine("\n");
            }

最後出現以下的結果畫面:


以下是完整的範例程式碼:

using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace JSON.NET
{
    class Program
    {
        static void Main(string[] args)
        {
            string bookjson =
                "[{\"title\":\"HTML5完美風暴\",\"pages\":1000,\"author\":\"呂高旭\"},"+
                " {\"title\":\"新世代ASP.NET升級之路\",\"pages\":280,\"author\":\"康廷數位研究室\"}," +
                " {\"title\":\"HTML5從零開始\",\"pages\":650,\"author\":\"呂高旭\"}]";

            List<JObject> books = JsonConvert.DeserializeObject<List<JObject>>(bookjson);
            var binfo = from b in books                      
                        select b;
            foreach(var b in binfo){
                Console.WriteLine("書名:"+b["title"] );
                Console.WriteLine("頁數:" + b["pages"]);
                Console.WriteLine("作者:" + b["author"]);
                Console.WriteLine("\n");
            }
            Console.ReadKey();
        } }}


沒有留言: