前言
最近项目中涉及到解析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++的,比较孤陋寡闻),比较有意思,虽然比较麻烦。