整理代码,今天遇到一个问题,就是从一个场景接口获取json,然后解析成对象。之前的时候都好好的,这次返回的json字符串里,由于字符编码的问题,格式上不能转换。一直以为是解析的过程编码有误,试了utf-8,gb2312,Default、Unicode,发现都不行,转回头去找获取的时候字符编码,发现是gbk,那就了然了。果断统一改成utf-8之后,数据获取就正常了。
这段代码从获取到解析,还不是很熟练,所以把整个过程都捋一遍。
首先是根据网络地址和参数获取的方法:
1 public static string CreateOrderList(string _tid, string _dateFrom, string _dateTo, string _state, int _page) 2 { 3 try 4 { 5 StringBuilder serviceUrl = new StringBuilder(); 6 serviceUrl.Append("http://10.10.10.10/queryOrderOne?"); 7 serviceUrl.AppendFormat("tid={0}&createDateFrom={1}&createDateTo={2}&pageNum={4}&pageSize=10&orderState={3}", _tid, _dateFrom, _dateTo, _state, _page); 8 string _result = ExcuteGet(serviceUrl.ToString(),""); 9 return _result; 10 } 11 catch (Exception e) 12 { 13 AddLog(_tid, "获取订单List异常:" + e.Message, "GetOrderList"); 14 return ""; 15 } 16 }
ExcuteGet方法是获取地址的具体方法,代码如下:
1 public static string ExcuteGet(string serviceUrl, string ReqInfo) 2 { 3 using (null) 4 { 5 ServicePointManager.ServerCertificateValidationCallback += ValidateServerCertificate; 6 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 7 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; 8 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceUrl); 9 request.CookieContainer = new CookieContainer(); 10 request.Headers.Add("userName", "test"); //设置信息头用户名 11 request.Headers.Add("password", "123456"); //设置信息头密码 12 request.KeepAlive = true; 13 request.Method = "GET"; 14 request.ContentType = "application/x-www-form-urlencoded"; 15 //添加发送数据 16 Encoding encoding = Encoding.GetEncoding("utf-8"); 17 if (!ReqInfo.Equals("")) 18 { 19 ReqInfo = "request=" + ReqInfo; 20 byte[] postData = encoding.GetBytes(ReqInfo); 21 request.ContentLength = postData.Length; 22 Stream requestStream = request.GetRequestStream(); 23 requestStream.Write(postData, 0, postData.Length); 24 } 25 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 26 //获取返回数据 27 Stream responseStream = response.GetResponseStream(); 28 if (responseStream == null) return ""; 29 StreamReader streamReader = new StreamReader(responseStream, encoding); 30 string retString = streamReader.ReadToEnd(); 31 streamReader.Close(); 32 responseStream.Close(); 33 return retString; 34 } 35 }
还有一部分:
1 private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 2 { 3 return true; 4 }
之后就是解析了,方法如下:
1 public static List<OrderList> GetOrderIList(string _dStrat, string _dEnd, string _tid, string _billState, int _page) 2 { 3 using (null) 4 { 5 try 6 { 7 string _jsonResult = CreateOrderList(_tid, _dStrat, _dEnd, _billState, _page); 8 OrderList _addResult = _jsonResult.JsonTodeserialize<OrderList>(Encoding.GetEncoding("utf-8")); 9 List<OrderList> _searchList = new List<OrderList>(); 10 _searchList.Add(_addResult); 11 return _searchList; 12 } 13 catch (Exception) 14 { 15 return new List<OrderList>(); 16 } 17 } 18 }
orderlist对象如下:
1 public class OrderList 2 { 3 public List<resultList> resultList { get; set; } 4 public string totalRecord { get; set; } 5 public string totalPage { get; set; } 6 } 7 public class resultList 8 { 9 public string orderState { get; set; } 10 public string Name { get; set; } 11 public string orderNum { get; set; } 12 public string productTypes { get; set; } 13 }