此处用到了 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("\t\n");
TXT_Info.AppendText("Productid: " + _list[i].Productid);
TXT_Info.AppendText("\t\n");
TXT_Info.AppendText("Productname: " + _list[i].Productname);
TXT_Info.AppendText("\t\n");
TXT_Info.AppendText("Price: " + _list[i].Price);
TXT_Info.AppendText("\t\n");
TXT_Info.AppendText("num: " + _list[i].num);
TXT_Info.AppendText("\t\n");
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("\t\n");
JObject jsonobject = (JObject)jsonarray[0];
TXT_Info.AppendText("status: " + jsonobject["status"].ToString());
TXT_Info.AppendText("\t\n");
onearray = (JArray)jsonobject["postPrice"];
for (int j = 0; j < onearray.Count; j++)
{
TXT_Info.AppendText("postPrice: ");
TXT_Info.AppendText("\t\n");
JObject oneobject = (JObject)(onearray[0]);
TXT_Info.AppendText("\tProductid: " + oneobject["Productid"].ToString());
TXT_Info.AppendText("\t\n");
TXT_Info.AppendText("\tProductname: " + oneobject["Productname"].ToString());
TXT_Info.AppendText("\t\n");
TXT_Info.AppendText("\tPrice: " + oneobject["Price"].ToString());
TXT_Info.AppendText("\t\n");
TXT_Info.AppendText("\tnum: " + oneobject["num"].ToString());
TXT_Info.AppendText("\t\n");
TXT_Info.AppendText("\turl: " + oneobject["url"].ToString());
TXT_Info.AppendText("\t\n");
}
}
}
这样.基本上就可以将返回来的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("\t\n");
TXT_Info.AppendText("获取值成功");
}
else
{
TXT_Info.AppendText("\t\n");
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("\t\n");
TXT_Info.AppendText("City_Code: " + _list[i].City_Code);
TXT_Info.AppendText("\t\n");
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 的方法了.