golang读取json格式的天气预报

使用天气预报的接口: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")

}

运行结果如下

相关文章

什么是Go的接口? 接口可以说是一种类型,可以粗略的理解为他...
1、Golang指针 在介绍Golang指针隐式间接引用前,先简单说下...
1、概述 1.1&#160;Protocol buffers定义 Protocol buffe...
判断文件是否存在,需要用到"os"包中的两个函数: os.Stat(...
1、编译环境 OS :Loongnix-Server Linux release 8.3 CPU指...
1、概述 Golang是一种强类型语言,虽然在代码中经常看到i:=1...