zoukankan      html  css  js  c++  java
  • Asp.net Json数据解析的一种思路

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

     

     

     

     

    分类: .NET杂谈

  • 相关阅读:
    Bzoj 3173: [Tjoi2013]最长上升子序列 平衡树,Treap,二分,树的序遍历
    Bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声 单调栈
    Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图
    Bzoj 1674: [Usaco2005]Part Acquisition dijkstra,堆
    Bzoj 3110: [Zjoi2013]K大数查询 树套树
    Cogs 309. [USACO 3.2] 香甜的黄油 dijkstra,堆,最短路,floyd
    面试题24:二叉排序树的后序遍历序列
    面试题23:从上往下打印二叉树
    面试题22:栈的压入、弹出序列
    面试题21:包含min函数的栈
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3317592.html
Copyright © 2011-2022 走看看