文档章节

golang读取json格式的天气预报

Mocos
 Mocos
发布于 2013/06/30 00:34
字数 686
阅读 2.7K
收藏 0

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

}

运行结果如下


© 著作权归作者所有

Mocos
粉丝 3
博文 12
码字总数 1123
作品 0
深圳
程序员
私信 提问
加载中

评论(2)

Mocos
Mocos 博主

引用来自“码农一枚”的评论

中文没有编码问题吗?

都是utf8的啊,window的dos 显示有问题的
蟒蛇
蟒蛇
中文没有编码问题吗?
Python从网络接口爬取json天气预报数据绘制高温低温双折线图

版权声明:本文为Zhang Phil原创文章,请不要转载! https://blog.csdn.net/zhangphil/article/details/88538112 Python从网络接口爬取json天气预报数据绘制高温低温双折线图 实现一个功能,...

zhangphil
2019/03/14
0
0
『简书API:Golang 处理 json 用法讲解(4):视频版』

大家好,我是谢伟,是一名程序员。 简书API:Jianshu-go 历史文章: 1.『简书API : jianshu 基于 golang (1)』 2.『简书API:jianshu 基于golang -- 用法介绍 (2)』 3. 『简书API:Goque...

谢小路
2018/04/15
0
0
golang中tcp socket粘包问题和处理

在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json格式的字符串: {"Id":1,"Name":"golang","Message":"message"} 当客户端发......

徐学良
2016/11/02
209
0
四行Python代码就能知道你那的天气,你敢信? - 知乎

今天给大家带来的Python实战项目是四行Python代码获取所在城市的天气预报,我们隐隐听到唏嘘声,不信四行Python代码可以获取是吗?那我们一起来看看: 使用Python获取天气预报,想想是件很简单...

Python头条
2019/10/21
0
0
Golang 学习笔记(09)—— json和xml解析

本文为转载,原文:Golang 学习笔记(09)—— json和xml解析 Golang xml package 函数 Marshal Marshal函数返回v的XML编码。 Marshal处理数组或者切片时会序列化每一个元素。Marshal处理指针...

ChainZhang
2018/01/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

普宁哪里可以开餐饮费发票-中国新闻网

普宁哪里可以开餐饮费发票【139 * 7⒏ б2 * 15 З9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridg...

17054723687
29分钟前
21
0
资兴哪里可以开餐饮费发票-中国新闻网

资兴哪里可以开餐饮费发票【139 * 7⒏ б2 * 15 З9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridg...

17054723480
38分钟前
32
0
沅江哪里可以开餐饮费发票-中国新闻网

沅江哪里可以开餐饮费发票【139 * 7⒏ б2 * 15 З9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridg...

17054723685
38分钟前
36
0
天津哪里可以开餐饮费发票-中国新闻网

天津哪里可以开餐饮费发票【139 * 7⒏ б2 * 15 З9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridg...

17054723617
38分钟前
33
0
汨罗哪里可以开餐饮费发票-中国新闻网

汨罗哪里可以开餐饮费发票【139 * 7⒏ б2 * 15 З9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridg...

17060820048
39分钟前
38
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部