zoukankan      html  css  js  c++  java
  • 天气接口数据解析

          前言:获取天气接口数据,需要用一些知识点,比如解析xml,Json数据转换成我们需要的对象,由于之前没有在项目用过。有做成一个小Demo分享下,同时也是让自己学习下。相关接口介绍可以参考课后网的谢周兵的文章:中国天气网接口返回json格式分析及接口(XML、图片接口)说明!
         首先,我们要做的是确定要取数据的城市,当然可以从全国开始,本文的示例仅限在福建省内,根据城市的中文拼音获取相关城市的天气数据。可以创建一个天气处理类WeatherHandler.cs。去中国天气网获取福建的市xml文件URL地址:http://flash.weather.com.cn/wmaps/xml/fujian.xml,获取返回城市的URL代码-用于取天气数据。方法如下:

     1  /// <summary>
     2         /// 获取城市Url代码 - 用于构建请求天气信息的Url地址
     3         /// 目前只支持福建省下级城市 
     4         /// </summary>
     5         /// <param name="cityName">城市名称-拼音 如:xiamen</param>
     6         /// <returns></returns>
     7         public static string GetCityCode(string cityName)
     8         {
     9             // 去中国天气网获取福建的市xml文件
    10             string provinceUrl = "http://flash.weather.com.cn/wmaps/xml/fujian.xml";
    11 
    12             // 解析加载回来的xml文件
    13             XmlDocument doc = new XmlDocument();
    14             doc.Load(new XmlTextReader(provinceUrl));
    15 
    16             // 返回城市Url代码 - 用于取天气数据
    17             string cityCode = null;
    18 
    19             if (doc.HasChildNodes)
    20             {
    21                 foreach (XmlNode pNode in doc.ChildNodes)
    22                 {
    23                     if (pNode.HasChildNodes)
    24                     {
    25                         foreach (XmlNode cNode in pNode.ChildNodes)
    26                         {
    27                             if (cNode.Attributes["pyName"].Value == cityName)
    28                             {
    29                                 cityCode = cNode.Attributes["url"].Value;
    30                                 break;  // 跳出循环
    31                             }
    32                         }
    33                     }
    34                 }
    35             }
    36 
    37             return cityCode;
    38         }

         第二,根据城市名称(如:xiamen)返回天气类信息,用第一步的方法获取对应返回城市Url代码(如:101230201),构建请求访问天气详细信息的Url地址(如:http://m.weather.com.cn/data/101230201.html),可以得到从中国天气网返回的json数据,我们根据需要返回的结果创建对应的对象WeatherJson,再通过反系列化成自定义好的对象WeatherJson,这样就可以通过对象的方式访问对的数据了。为了让代码复用性更高些,请求发送数据也独立成一个方法。参考代码如下:

     1 /// <summary>
     2         /// 发送请求返回响应的数据
     3         /// </summary>
     4         /// <param name="url">请求的Url地址</param>
     5         /// <returns></returns>
     6         public static string GetRequestData(string url)
     7         {
     8             // 构建一个请求
     9             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    10             // 请求的方式
    11             request.Method = "GET";
    12 
    13             // 请求的响应
    14             HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    15 
    16             // 响应的流
    17             Stream responseStream = response.GetResponseStream();
    18 
    19             // 字符编码
    20             Encoding enc = Encoding.GetEncoding("utf-8");
    21 
    22             // 读取流
    23             StreamReader readResponseStream = new StreamReader(responseStream, enc);
    24 
    25             // 请求的结果
    26             string result = readResponseStream.ReadToEnd();
    27 
    28             // 关闭流,响应,释放资源
    29             readResponseStream.Close();
    30             response.Close();
    31 
    32             return result;
    33 
    34         }
    35 
    36 /// <summary>
    37         /// 根据城市名称返回天气类信息
    38         /// 目录只支持福建省下级城市
    39         /// </summary>
    40         /// <param name="cityName">城市名称-拼音 如:xiamen</param>
    41         /// <returns></returns>
    42         public static WeatherInfo GetWeatherInfo(string cityName)
    43         {
    44             // 填充相关的WeatherInfo数据
    45             WeatherInfo wInfo = null;
    46 
    47             try
    48             {
    49                 // 城市Url代码
    50                 string cityCode = GetCityCode(cityName);
    51 
    52                 // 访问天气详细信息的Url地址
    53                 string weatherUrl = "http://m.weather.com.cn/data/" + cityCode + ".html";
    54 
    55                 // 从中国天气网返回的json数据
    56                 string jsonData = GetRequestData(weatherUrl);
    57 
    58                 // 根据返回的Json数据反系列化自定义好的对象
    59                 WeatherJson json = JsonSerializerHelper.FromJsonTo<WeatherJson>(jsonData);
    60 
    61                 // 填充相关的WeatherInfo数据
    62                 wInfo = json.WeatherInfo;    
    63             }
    64             catch (Exception)
    65             {
    66             }        
    67 
    68             return wInfo;
    69 
    70         }

          第三,就可以调用转换好的对象进行使用了,比如我在控制台输出我想要的数据。

     1 // 确定要取的城市名称 - 拼音
     2             string cityName = "xiamen";
     3 
     4 
     5             WeatherInfo weatherInfo = WeatherHandler.GetWeatherInfo(cityName);
     6 
     7             Console.WriteLine("weatherInfo.City:" + weatherInfo.City);
     8             Console.WriteLine("weatherInfo.CityEn:" + weatherInfo.CityEn);
     9             Console.WriteLine("weatherInfo.CityId:" + weatherInfo.CityId);
    10             Console.WriteLine("weatherInfo.DateY:" + weatherInfo.DateY);
    11             Console.WriteLine("weatherInfo.FutureTemperature:" + weatherInfo.FutureTemperature);
    12             Console.WriteLine("weatherInfo.TodayTemperature:" + weatherInfo.TodayTemperature);
    13             Console.WriteLine("weatherInfo.TomorrowTemperature:" + weatherInfo.TomorrowTemperature);
    14             Console.WriteLine("weatherInfo.Week:" + weatherInfo.Week);
    15            
    16             Console.ReadLine();

    效果图片:

       最后,关于Json数据转换,我参考博客园作者“颓废”的博文Json序列化和反序列化方法实现的,这边代码就不帖出来了。需要了解的同学可以到相关博客去了解!项目Demo

    感谢你的阅读,如果对你有帮助,请支持我!请点[推荐]
    如果有意见或建议,欢迎留言交流!
    欢迎转载,请保留出处,冰慧感谢你的关注与支持!
  • 相关阅读:
    PTA|基础编程题目集|7-8
    PTA|基础编程题目集|7-7
    PTA|基础编程题目集|7-11
    PTA|基础编程题目集|7-3
    PTA|基础编程题目集|7-2
    PTA|基础编程题目集|7-1
    PTA|基础编程题目集|7-5
    PTA|基础编程题目集|7-6
    scrapy-redis使用以及剖析
    Python数据库连接池DBUtils
  • 原文地址:https://www.cnblogs.com/huangxiufen/p/2801177.html
Copyright © 2011-2022 走看看