zoukankan      html  css  js  c++  java
  • Asp.net Json 解析 与 直接用ip访问返回josn

    数据分析

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

    {"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"}
              }
    }
    View Code

    这段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; }
        }
    }
    View Code

    对于zhishu下的项目,建立的类如下:

    namespace Nxt.Common.Weather
    {
        public class IndexPoint
        {
            //zhishu
            public int value { get; set; }
            public string name { get; set; }
        }
    }
    View Code

    对于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; }
        }
    }
    View Code

    对于location下面的项目,建立的类如下:

    namespace Nxt.Common.Weather
    {
       public  class Location
        {
            //location
            public string lat { get; set; }
            public string lng { get; set; }
        }
    View Code

    当第三层的都建立完毕后,现在来建立第二层,第二层的对象如上面所述,但是需要注意的是,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>();
            }
        }
    }
    View Code

    上面的代码是依据JSON数据的结构而建立的,这样能够最大程度避免数据的不准确性。
    最后,建立顶层的类:

    namespace Nxt.Common.Weather
    {
        public class Daemon
        {
            public WeatherMain wdata { get; set; }
         }
    }
    View Code

    这样,我们的类结构就建立完毕了。

    最后审查一下我们建立的类结构,是不是和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;
            }
        }
    }
    View Code

    注:使用JavaScriptSerializer,我们需要引用System.web.extensions.

  • 相关阅读:
    POJ 2240 Arbitrage spfa 判正环
    POJ 3259 Wormholes spfa 判负环
    POJ1680 Currency Exchange SPFA判正环
    HDU5649 DZY Loves Sorting 线段树
    HDU 5648 DZY Loves Math 暴力打表
    HDU5647 DZY Loves Connecting 树形DP
    CDOJ 1071 秋实大哥下棋 线段树
    HDU5046 Airport dancing links 重复覆盖+二分
    HDU 3335 Divisibility dancing links 重复覆盖
    FZU1686 神龙的难题 dancing links 重复覆盖
  • 原文地址:https://www.cnblogs.com/weixing/p/3318761.html
Copyright © 2011-2022 走看看