此处用到了 Newtonsoft.Json 这个DLL文件.因为里面已经封装了很多方法.
具体下载地址 : http://files.cnblogs.com/cgdou/Json50r8.zip
里面包含了.NET 框架的各个版本.这里,我用到的是 .NET 4.0
解析JSON有两种方式,下面将会把代码贴出来.
先导入命名空间:
using Newtonsoft.Json; using System.Web; using Newtonsoft.Json.Linq;
第一种方法:
反序列化JSON字符串,将JSON字符串转换成LIST列表
先定义一个类,类中变量和返回的JSON字段值一样:
public class Customer { //在序列化前后没有变动 public string Productid { get; set; } //在序列化前后设置和重置 public string Productname { get; set; } //设置为null,但在序列化后填充 public string Price { get; set; } public string num { get; set; } //设置为null,但在序列化后填充 public string url { get; set; } public string Other { get; set; } public Customer() { // //TODO: 在此处添加构造函数逻辑 // Productid = ""; Productname = ""; Price = ""; num = ""; url = ""; Other = null; } }
然后是解析的方法:
void GetListJson() { // string jsonText = "[{'Productid':'1','Productname': '手机','Price':25.5,'num': 1000,'url':'http://www.baidu.com'}]"; string jsonText = "[{"Productid":1,"Productname": "手机","Price":25.5,"num": 1000,"url":"http://www.baidu.com"}]"; List<Customer> _list = JsonConvert.DeserializeObject<List<Customer>>(jsonText); //读取列表中的值 // Console.WriteLine(_list[1].status); for (int i = 0; i < _list.Count; i++) { TXT_Info.AppendText(" "); TXT_Info.AppendText("Productid: " + _list[i].Productid); TXT_Info.AppendText(" "); TXT_Info.AppendText("Productname: " + _list[i].Productname); TXT_Info.AppendText(" "); TXT_Info.AppendText("Price: " + _list[i].Price); TXT_Info.AppendText(" "); TXT_Info.AppendText("num: " + _list[i].num); TXT_Info.AppendText(" "); TXT_Info.AppendText("url: " + _list[i].url); } }
以后是第一 种,解析比较简单的JSON可以,但如果碰到JSON里面嵌套JSON的情况是,就要用下面这种方法:
String jsonText = "[{"status":"1","postPrice":[{"Productid":1,"Productname": "手机","Price":25.5,"num": 1000,"url":"http://www.baidu.com"}]}]";
方法如下:
void GetJArryJson() { String jsonText = "[{"status":"1","postPrice":[{"Productid":1,"Productname": "手机","Price":25.5,"num": 1000,"url":"http://www.baidu.com"}]}]"; JArray jsonarray = (JArray)JsonConvert.DeserializeObject(jsonText); JArray onearray = null; for (int i = 0; i < jsonarray.Count; i++) { TXT_Info.AppendText(" "); JObject jsonobject = (JObject)jsonarray[0]; TXT_Info.AppendText("status: " + jsonobject["status"].ToString()); TXT_Info.AppendText(" "); onearray = (JArray)jsonobject["postPrice"]; for (int j = 0; j < onearray.Count; j++) { TXT_Info.AppendText("postPrice: "); TXT_Info.AppendText(" "); JObject oneobject = (JObject)(onearray[0]); TXT_Info.AppendText(" Productid: " + oneobject["Productid"].ToString()); TXT_Info.AppendText(" "); TXT_Info.AppendText(" Productname: " + oneobject["Productname"].ToString()); TXT_Info.AppendText(" "); TXT_Info.AppendText(" Price: " + oneobject["Price"].ToString()); TXT_Info.AppendText(" "); TXT_Info.AppendText(" num: " + oneobject["num"].ToString()); TXT_Info.AppendText(" "); TXT_Info.AppendText(" url: " + oneobject["url"].ToString()); TXT_Info.AppendText(" "); } } }
这样.基本上就可以将返回来的JSON进行解析了.
下面是一种生产环境下会碰到的情况,调用远程REST来获取JSON:
方法如下,这里使用了第一种方法,将JSON转到List:
void GetCityListJson(String Pcode) { HttpURL = "http://localhost:8060/MyRest/CommonMethodResource/jsonCity/" + Pcode; urlvalue = HttpWebResponseUtility.CreateGetHttpResponse(HttpURL, null, null, null, "utf-8"); // 开始获取REST的加密信息 if (urlvalue.Length > 5) { TXT_Info.AppendText(" "); TXT_Info.AppendText("获取值成功"); } else { TXT_Info.AppendText(" "); TXT_Info.AppendText("获取值失败"); return; } List<JsonCity> _list = JsonConvert.DeserializeObject<List<JsonCity>>(urlvalue); //读取列表中的值 // Console.WriteLine(_list[1].status); for (int i = 0; i < _list.Count; i++) { TXT_Info.AppendText(" "); TXT_Info.AppendText("City_Code: " + _list[i].City_Code); TXT_Info.AppendText(" "); TXT_Info.AppendText("City: " + _list[i].City); } }
相对应的类:
public class JsonCity { //在序列化前后没有变动 public string City_Code { get; set; } //在序列化前后设置和重置 public string City { get; set; } public JsonCity() { // //TODO: 在此处添加构造函数逻辑 // City_Code = ""; City = ""; } }
以下是我解析HTTP请求用到的类文件:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Net; using System.IO; using System.IO.Compression; using System.Text.RegularExpressions; namespace REST { class HttpWebResponseUtility { private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; /// <summary> /// 创建GET方式的HTTP请求 /// </summary> /// <param name="url">请求的URL</param> /// <param name="timeout">请求的超时时间</param> /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param> /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param> /// <returns></returns> public static string CreateGetHttpResponse(string url, int? timeout, string userAgent, CookieCollection cookies, string type) { try { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; request.Method = "GET"; request.UserAgent = DefaultUserAgent; if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value; } if (cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); } System.IO.Stream respStream = (request.GetResponse() as HttpWebResponse).GetResponseStream(); using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream, Encoding.GetEncoding(type))) { return reader.ReadToEnd(); } } catch (System.Exception ex) { //errorMsg = ex.Message; } return ""; } /// <summary> /// 创建POST方式的HTTP请求 /// </summary> /// <param name="url">请求的URL</param> /// <param name="parameters">随同请求POST的参数名称及参数值字典</param> /// <param name="timeout">请求的超时时间</param> /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param> /// <param name="requestEncoding">发送HTTP请求时所用的编码</param> /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param> /// <returns></returns> public static string CreatePostHttpResponse(string url, IDictionary<string, string> parameters, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies, string type) { try { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } if (requestEncoding == null) { throw new ArgumentNullException("requestEncoding"); } HttpWebRequest request = null; //如果是发送HTTPS请求 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } else { request.UserAgent = DefaultUserAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value; } if (cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); } //如果需要POST数据 if (!(parameters == null || parameters.Count == 0)) { StringBuilder buffer = new StringBuilder(); int i = 0; foreach (string key in parameters.Keys) { if (i > 0) { buffer.AppendFormat("&{0}={1}", key, parameters[key]); } else { buffer.AppendFormat("{0}={1}", key, parameters[key]); } i++; } byte[] data = requestEncoding.GetBytes(buffer.ToString()); using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } } System.IO.Stream respStream = (request.GetResponse() as HttpWebResponse).GetResponseStream(); using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream, Encoding.GetEncoding(type))) { return reader.ReadToEnd(); } } catch (System.Exception ex) { //errorMsg = ex.Message; } return ""; } private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; //总是接受 } } }
以上,就是我用来解析 JSON 的方法了.