使用天气预报的接口: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,"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,"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": "零星雷雨","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,"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") }
运行结果如下