C#实现天气预报

来源:互联网 发布:sql server身份验证sa 编辑:程序博客网 时间:2024/06/07 00:36

</pre>        我用的数据是来源于和风全球天气(企业),接口是百度提供的,api:<span style="color:rgb(51,51,51); font-family:Helvetica,'Microsoft Yahei',Arial,sans-serif; font-size:13px; line-height:14px">http://apis.baidu.com/heweather/weather/free,获取百度apikey的地址:http://apistore.baidu.com/apiworks/servicedetail/478.html,不多扯了,先上源码:<a target=_blank target="_blank" href="http://download.csdn.net/detail/xtcgch/9549829">源码</a>下载。</span><p></p><p><span style="color:rgb(51,51,51); font-family:Helvetica,'Microsoft Yahei',Arial,sans-serif; font-size:13px; line-height:14px">      解析json要用到Newtonsoft.Json.dll文件,下载地址:<a target=_blank target="_blank" href="http://download.csdn.net/detail/xtcgch/9549837">源码下载</a></span></p><p><span style="color:rgb(51,51,51); font-family:Helvetica,'Microsoft Yahei',Arial,sans-serif; font-size:13px; line-height:14px">      要从api获取天气数据,还需要在百度上申请apikey,申请好apikey之后替换getJson.cs文件中这一句代码request.Headers.Add("apikey", "你的apikey");中的“您的apikey”字段,然后请求api的代码和返回数据格式在<a target=_blank target="_blank" href="http://apistore.baidu.com/apiworks/servicedetail/478.html">获取api方法和返回数据格式</a>页面都有,这里不多说了,这里只说如何解析json数据。</span></p><p><span style="color:rgb(51,51,51); font-family:Helvetica,'Microsoft Yahei',Arial,sans-serif; font-size:13px; line-height:14px">      首先要先引用<span style="color:rgb(51,51,51); font-family:Helvetica,'Microsoft Yahei',Arial,sans-serif; font-size:13px; line-height:14px">Newtonsoft.Json.dll这各dll,里面有JObject和JToken是我们要用到的。关键代码为:</span></span></p><pre name="code" class="csharp">            JObject firstObj = JObject.Parse(data);            JToken firstToken = firstObj[name];
aqi aqi = JsonConvert.DeserializeObject<aqi>(<span style="font-family: Helvetica, 'Microsoft Yahei', Arial, sans-serif;">firstToken </span><span style="font-family: Helvetica, 'Microsoft Yahei', Arial, sans-serif;">.ToString());</span>
其中第一句是把json字符串data转为jobject的格式,第二句是根据name来查找value值,第三句是把firstToken里面的字符串转为实体类,aqi就是一个实体类 。例如:data是
{"wind":{"deg":"240","dir":"西南风","sc":"4-5","spd":"19"}}
name就是“wind”,value就是
{"deg":"240","dir":"西南风","sc":"4-5","spd":"19"}
      了解这个取值步骤后就可以对返回的json数据进行解析了,先来个数据的总体结构图:


首先要获取“HeWeather data service 3.0”后面的数据:

            string name = String.Empty;            int start_text = file_data.IndexOf("\"") + 1;            int end_text = file_data.IndexOf(":") - 1;            int len_text = end_text - start_text;            name = file_data.Substring(start_text, len_text);            JObject firstObj = JObject.Parse(data);            JToken firstToken = firstObj[name];
firstToken里面就是获取到的,注意:后面的数据里是包含“[]”,这样的数据是不能直接转为实体类的,必须要去掉“[]”
去掉"[]"的代码:
            file_data = JsonConvert.SerializeObject(firstToken);            int start_index = file_data.IndexOf('[') + 1;            int end_index = file_data.LastIndexOf(']');            int len = end_index - start_index;            file_data = file_data.Substring(start_index, len);            JObject Obj = JObject.Parse(file_data);
Obj就是去掉“[]”后的json格式数据对象,这样就可以直接获取想要的数据了,如获取“aqi”的数据:

//获取aqi的信息            JToken aqiToken = Obj["aqi"];            aqi aqi = JsonConvert.DeserializeObject<aqi>(aqiToken.ToString());


但是要注意,七天天气和即时天气的数据里面还是包含“[]”,所以不能直接存储到实体类,还是要先去掉“[]”这两个符号,再用
List<aqi> aqi = JsonConvert.DeserializeObject<List<aqi>>(aqiToken.ToString());
来获取即可。

最后的效果图如下:




0 0