数据分析
目前手头上需要制作一个天气预报功能,现成的接口已经有了。我随便输入一个城市,然后出现了如下的信息:

{"wdata":{"cityName":"鹤壁", "location":{"lat":"35.62", "lng":"114.18"}, "today":"2013-9-12 10:30:00", "sevDays":[{"date":"2013-9-12 20:00:00","Tmax":"28","weatherID":"02转01","windDir":"0","windPower":"0","Tmin":"18"}, {"date":"2013-9-13 20:00:00","Tmax":"33","weatherID":"00","windDir":"0","windPower":"0","Tmin":"18"}, {"date":"2013-9-14 20:00:00","Tmax":"35","weatherID":"00","windDir":"0","windPower":"0","Tmin":"19"}, {"date":"2013-9-15 20:00:00","Tmax":"27","weatherID":"01","windDir":"0","windPower":"0","Tmin":"16"}, {"date":"2013-9-16 20:00:00","Tmax":"25","weatherID":"01","windDir":"0","windPower":"0","Tmin":"17"}, {"date":"2013-9-17 20:00:00","Tmax":"26","weatherID":"02","windDir":"0","windPower":"0","Tmin":"18"}, {"date":"2013-9-18 20:00:00","Tmax":"27","weatherID":"02转07","windDir":"0","windPower":"0","Tmin":"16"}], "zhishu":[{"value":"2","name":"CY"}, {"value":"0","name":"ZS"}, {"value":"8","name":"FH"}, {"value":"2","name":"ZWX"}, {"value":"4","name":"KQWR"}, {"value":"2","name":"LY"}, {"value":"1","name":"JT"}, {"value":"1","name":"GM"}, {"value":"1","name":"SSD"}], "currentMessage":{"reportTime":"2013-9-12 13:00:00", "weatherID":"02", "temperature":"27", "windDir":"4", "windPower":"0", "humidity":"69.0", "visibility":"8", "pressure":"1012.2", "sunrise":"6:01", "sunset":"18:38"} } }
这段JSON数据结构比一般的要复杂那么一点,不过从其结构来看:
第一层应该是wdata。
第二层是cityName(城市名称),location(经纬度),today(当前时间),sevDays(后续天气),zhishu(指数),currentMessage(当前预报信息)。
第三层是:location下面的lat,lng;sevDays下面的date,Tmax,weatherID,windDir,windPower,Tmin; 然后是zhishu下面的value 和 name;最后是currentMessage下面的reportTime,weatherID,temperature,windDir,windPower,humidity,visibility,pressure,sunrise,sunset信息:
所以,总共说来,这个JSON数据总共就三层。
解析方式
那么,如何来解析呢?
其实,我们完全可以从最底层的结构分析起来,然后简历相关的类,最后把这些建立的类组合成类似json数据的结构就可以了。
这里,最底层就是第三层,我们开始建立起相关的类对象:
对于sevDays下的项目, 建立如下类:

using System; namespace Nxt.Common.Weather { public class DateReleation { //sevDays public DateTime date { get; set; } public int Tmax { get; set; } public string weatherID { get; set; } public int windDir { get; set; } public int windPower { get; set; } public int Tmin { get; set; } } }
对于zhishu下的项目,建立的类如下:

namespace Nxt.Common.Weather { public class IndexPoint { //zhishu public int value { get; set; } public string name { get; set; } } }
对于currentMessage下的项目,建立的类如下:

using System; namespace Nxt.Common.Weather { public class CurrentMessage { //currentMessage public DateTime reportTime { get; set; } public string weatherID {get;set;} public double temperature { get; set; } public string windDir { get; set; } public string windPower { get; set; } public double humidity { get; set; } public string visibility { get; set; } public double pressure { get; set; } public string sunrise { get; set; } public string sunset { get; set; } } }
对于location下面的项目,建立的类如下:

namespace Nxt.Common.Weather { public class Location { //location public string lat { get; set; } public string lng { get; set; } }
当第三层的都建立完毕后,现在来建立第二层,第二层的对象如上面所述,但是需要注意的是,sevDays,zhishu都是可以有多条记录的 ,所以我们得用List对象来保存。

using System; using System.Collections.Generic; namespace Nxt.Common.Weather { public class WeatherMain { //wdata public string cityName { get; set; } public Location location { get; set; } public DateTime today { get; set; } public List<DateReleation> sevDays { get; set; } public List<IndexPoint> zhishu { get; set; } public CurrentMessage currentMessage { get; set; } public WeatherMain() { sevDays = new List<DateReleation>(); zhishu = new List<IndexPoint>(); } } }
上面的代码是依据JSON数据的结构而建立的,这样能够最大程度避免数据的不准确性。
最后,建立顶层的类:

namespace Nxt.Common.Weather { public class Daemon { public WeatherMain wdata { get; set; } } }
这样,我们的类结构就建立完毕了。
最后审查一下我们建立的类结构,是不是和JSON数据的组织结构是一样的呢?
如果是一样的,让我们进入下一步:

using System; using System.IO; using System.Net; using System.Web.Script.Serialization; using Nxt.Common.Weather; using System.Text; namespace Nxt.Web.Code { public class WeatherDaemon { public Daemon GetWeather(string areaName) { string url = "http://weather.****.net/Weather/getWeather.php?area=" + areaName; WebRequest request = WebRequest.Create(url); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream dataStream = response.GetResponseStream(); string weatherData = string.Empty; if (dataStream != null) { try { using (StreamReader reader = new StreamReader(dataStream, Encoding.UTF8)) { weatherData = reader.ReadToEnd(); } } catch (OutOfMemoryException oe) { throw new Exception(oe.Data.ToString()); } catch (IOException ie) { throw new Exception(ie.Data.ToString()); } } if (!String.IsNullOrEmpty(weatherData)) { JavaScriptSerializer ser = new JavaScriptSerializer(); Daemon main = ser.Deserialize<Daemon>(weatherData); return main; } return null; } } }
注:使用JavaScriptSerializer,我们需要引用System.web.extensions.