使用天气预报的接口:http://weather.china.xappengine.com/api?city=南宁 (找了好久才找到一个支持拼音的,不过好像小地方是没数据的)
访问得到json格式压缩的数据,格式化后
{ "pub": "2013-06-29 22:59", "name": "南宁", "wind": { "chill": 81, "direction": 140, "speed": 7 }, "astronomy": { "sunrise": "6:05", "sunset": "19:34" }, "atmosphere": { "humidity": 89, "visibility": 6.21, "pressure": 29.71, "rising": 1 }, "forecasts": [ { "date": "2013-06-29", "day": 6, "code": 29, "text": "局部多云", "low": 26, "high": 32, "image_large": "http://weather.china.xappengine.com/static/w/img/d29.png", "image_small": "http://weather.china.xappengine.com/static/w/img/s29.png" }, { "date": "2013-06-30", "day": 0, "code": 30, "text": "局部多云", "low": 25, "high": 33, "image_large": "http://weather.china.xappengine.com/static/w/img/d30.png", "image_small": "http://weather.china.xappengine.com/static/w/img/s30.png" }, { "date": "2013-07-01", "day": 1, "code": 37, "text": "局部雷雨", "low": 24, "high": 32, "image_large": "http://weather.china.xappengine.com/static/w/img/d37.png", "image_small": "http://weather.china.xappengine.com/static/w/img/s37.png" }, { "date": "2013-07-02", "day": 2, "code": 38, "text": "零星雷雨", "low": 25, "high": 32, "image_large": "http://weather.china.xappengine.com/static/w/img/d38.png", "image_small": "http://weather.china.xappengine.com/static/w/img/s38.png" }, { "date": "2013-07-03", "day": 3, "code": 38, "text": "零星雷雨", "low": 25, "high": 32, "image_large": "http://weather.china.xappengine.com/static/w/img/d38.png", "image_small": "http://weather.china.xappengine.com/static/w/img/s38.png" } ] }GO语言内置的encoding/json标准库,Json.Unmarshal() 可以解析json数据
约定:json中的布尔值会解析为布尔值,数字(整数,浮点型)解析为float64,string解析为string,数组解析为接口数组,空值解析为nil。 这些字段在类型声明中必须都是以大写字母开头、可被导出的字段。
Json.Unmarshal()函数会根据一个约定的顺序查找目标结构中的字段,如果找到一个则进行匹配。当JSON数据中的数据结构和GO中的目标类型不匹配时,json.Unmarshal()函数在解码过程中会丢弃该字段。
Json.Unmarshal()函数也支持读取未知的结构的json数据,允许使用map[string]interface{}和[]interface{}类型的值来分别存放未知结构的JSON对象或数组。
package main import ( "encoding/json" "io/ioutil" "net/http" "fmt" ) //对应json天气数据源的结构,头字母大写 type WeatherInfoJson struct { Pub string Name string Wind WindObject Astronomy AstronomyObject Atmosphere AtmosphereObject Forecasts []ForecastsObject } type WindObject struct { Chill float64 Direction float64 Speed float64 } type AstronomyObject struct { Sunrise string Sunset string } type AtmosphereObject struct { Humidity float64 Visibility float64 Pressure float64 Rising float64 } type ForecastsObject struct { Date string Day float64 Code float64 Text string Low float64 High float64 Image_large string Image_small string } func GetWeather(city string) { str:="http://weather.china.xappengine.com/api?city="+city resp, err := http.Get(str) //使用get方法访问 if err != nil { return } defer resp.Body.Close() input, err1 := ioutil.ReadAll(resp.Body) //读取流数据 if err1 != nil { return } var jsonWeather WeatherInfoJson err2:=json.Unmarshal(input, &jsonWeather) //解析json数据 if err2 != nil { return } if len(jsonWeather.Name)!=0 { //判断有无解析数据 for i := 0; i < 3; i++ { fmt.Printf("-->地区:%s 时间:%s 温度:%d-%d 天气:%s 发布时间:%s\n", jsonWeather.Name,jsonWeather.Forecasts[i].Date,int(jsonWeather.Forecasts[i].Low),int(jsonWeather.Forecasts[i].High),jsonWeather.Forecasts[i].Text,jsonWeather.Pub) } } } func main(){ GetWeather("深圳") GetWeather("nanning") }
运行结果如下
有疑问加站长微信联系(非本文作者)