兩種方式解析json---C# WinForm

前言

最近項目中涉及到解析json,他可以用兩種方式實現,自帶的和第三方的,感興趣的都瞭解一下吧。

 

兩種方式介紹

自己的方式(Serialization.Json)

C#自帶的方式操作json是以序列化和反序列的方式。

這種方式解析json比較麻煩,自己要寫一個數字協議DataContract,進行序列化處理。注意json裏的key值 要和定義的數字協議(DataContract)的數字成員(DataMember)的名稱相對應,因爲他是根據名稱對應的,不然解析到的數據是null。

首先我們要引用System.Runtime.Serialization,這個可以在【引用管理器】的【程序集】裏面找到。

所在的命名空間爲:

using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

我的要解析的數據爲:

{
	"TERMINAL": [{
		"TERMINAL_IP": "192.168.21.5",
		"TERMINAL_CMDPORT": "8080",
		"TERMINAL_DATAPORT": "",
		"TERMINAL_CONNECT_STATE": "",
		"TERMINAL_ID": "017993",
		"TERMINAL_USB_SUM": "40",
		"TERMINAL_SOFT_VERSION": "2.001007",
		"TERMINAL_MODEL": "C40",
		"TERMINAL_ALL_USBPORTS_STATE": ""
	}]
}

我自己寫的數字協議:

    [DataContract]
    class TERMINALINFO
    {
        [DataMember(Order =0)]
        public string TERMINAL_IP { get; set; }
        [DataMember(Order = 1)]
        public string TERMINAL_CMDPORT { get; set; }
        [DataMember(Order = 2)]
        public string TERMINAL_DATAPORT { get; set; }
        [DataMember(Order = 3)]
        public string TERMINAL_CONNECT_STATE { get; set; }
        [DataMember(Order = 4)]
        public string TERMINAL_ID { get; set; }
        [DataMember(Order = 5)]
        public string TERMINAL_USB_SUM { get; set; }
        [DataMember(Order = 6)]
        public string TERMINAL_SOFT_VERSION { get; set; }
        [DataMember(Order = 7)]
        public string TERMINAL_MODEL { get; set; }
        [DataMember(Order = 8)]
        public string TERMINAL_ALL_USBPORTS_STATE { get; set; }
    }
    [DataContract]
    class USBShare
    {
        [DataMember(Order = 0)]
        public TERMINALINFO[] TERMINAL { get; set; }
    }

 

解析獲取數據的方法(如下),updateInfo就是獲取到的數據(下圖所示)。

        public static void parseJson(string result)
        {
            var mStream = new System.IO.MemoryStream(Encoding.Default.GetBytes(result));
            var serializer = new DataContractJsonSerializer((typeof(USBShare)));
            USBShare updateInfo = (USBShare)serializer.ReadObject(mStream);
        }

 

 

第三方庫解析(Newtonsoft.Json)

Newtonsoft.Json是開源的C#處理json的第三方庫,在GitHub(https://github.com/JamesNK/Newtonsoft.Json)可以找到源碼和你所需要的動態庫。

有兩種方式引用它的動態庫,第一種就是根據你的框架選擇合適的動態庫(我的是Json120r2版本,有如下這麼多個可用的框架),將對應的動態庫放到你項目下,進行引用。

第二種,就是 選中當前項目右鍵 選中【管理NuGet程序包】,如下,然後過濾搜索【Newtonsoft.Json】,然後將其【安裝】。

安裝結束後,我們可以看到【引用】裏面已經有它了,然後就可直接使用其命名空間,編譯後,就可以在生成文件夾裏面看到Newtonsoft.Json.dll了,這種方式是自動根據框架選擇對應的動態庫,很方便。

代碼如下(我只解析了我需要的部分),

        public void parseJsonOfTerminal(string jsonText)
        {
           JObject jObj = JObject.Parse(jsonText);
            JArray jArray = JArray.Parse(jObj["TERMINAL"].ToString());

            for (int i = 0; i < jArray.Count(); i++)
            {
                JObject tempo = JObject.Parse(jArray[i].ToString());
                info.ip = tempo["TERMINAL_IP"].ToString();
                info.port = tempo["TERMINAL_CMDPORT"].ToString();
                info.id = tempo["TERMINAL_ID"].ToString();
            }
        }

 記得寫命名空間

using Newtonsoft.Json.Linq;

結束語

這就是C#解析json的兩種方式,自帶的那種寫法我第一遇到(我之前是寫Qt C++的,比較孤陋寡聞),比較有意思,雖然比較麻煩。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章