前言
最近項目中涉及到解析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++的,比較孤陋寡聞),比較有意思,雖然比較麻煩。