Asp.net Json数据解析的一种思路

来源:互联网 发布:mac 终端 路径 编辑:程序博客网 时间:2024/05/22 09:32

Asp.net Json数据解析的一种思路

在日常的编码中,经常会遇到JSON类型的数据,有简单的,也有复杂的。对于简单的,我们可以用正则等匹配,但是一旦遇到复杂的,就比较难办了。

数据分析

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

复制代码
{"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.)
最后看看结果,我们是不是得到了想要的数据呢?

原创粉丝点击