如何拿到[]interface{}里面有的map

shenwei12303 · 2018-04-19 13:59:32 · 5040 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-04-19 13:59:32 的主题,其中的信息可能已经有所发展或是发生改变。

package main

import (
    "net/http"
    "io/ioutil"
    "encoding/json"
    "fmt"
)

func main() {
    addr := "http://wthrcdn.etouch.cn/weather_mini?city=上海"
    resp, err := http.Get(addr)
    defer resp.Body.Close()
    if err != nil {
        panic(err)
    }
    b, err := ioutil.ReadAll(resp.Body)
    var v map[string]interface{}
    json.Unmarshal(b, &v)
    v1 := (v["data"]).(map[string]interface{})
    v2 := v1["forecast"]
    fmt.Println(v2)
}

===================到最后是一个[]interface{}=======================

[map[type:晴 date:19日星期四 high:高温 27℃ fengli:<![CDATA[<3级]]> low:低温 16℃ fengxiang:东南风] map[date:20日星期五 high:高温 27℃ fengli:<![CDATA[3-4级]]> low:低温 17℃ fengxiang:东南风 type:晴] map[type:多云 date:21日星期六 high:高温 27℃ fengli:<![CDATA[3-4级]]> low:低温 19℃ fengxiang:东南风] map[date:22日星期天 high:高温 25℃ fengli:<![CDATA[<3级]]> low:低温 15℃ fengxiang:东南风 type:小雨] map[date:23日星期一 high:高温 21℃ fengli:<![CDATA[3-4级]]> low:低温 13℃ fengxiang:西北风 type:中雨]]

========================================================== 想不到怎么处理了, 求解


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5040 次点击  
加入收藏 微博
7 回复  |  直到 2018-05-11 09:47:14
channel
channel · #1 · 7年之前

通过断言为 []interface{} 类型,然后遍历,每个元素,又断言为 map

当然,这种的,也可以通过定义结构体解析或者使用 https://github.com/tidwall/gjson

momaek
momaek · #2 · 7年之前

这个API返回的json已经很简单了,直接定义结构体就可以解决你的问题

momaek
momaek · #3 · 7年之前
type AutoGenerated struct {
    Data struct {
        Yesterday struct {
            Date string `json:"date"`
            High string `json:"high"`
            Fx   string `json:"fx"`
            Low  string `json:"low"`
            Fl   string `json:"fl"`
            Type string `json:"type"`
        } `json:"yesterday"`
        City     string `json:"city"`
        Aqi      string `json:"aqi"`
        Forecast []struct {
            Date      string `json:"date"`
            High      string `json:"high"`
            Fengli    string `json:"fengli"`
            Low       string `json:"low"`
            Fengxiang string `json:"fengxiang"`
            Type      string `json:"type"`
        } `json:"forecast"`
        Ganmao string `json:"ganmao"`
        Wendu  string `json:"wendu"`
    } `json:"data"`
    Status int    `json:"status"`
    Desc   string `json:"desc"`
}

惊了, 写这个API的人有点厉害。。。 Fx, Fengxiang, Fl, Fengli

shenwei12303
shenwei12303 · #4 · 7年之前
momaekmomaek #3 回复

``` type AutoGenerated struct { Data struct { Yesterday struct { Date string `json:"date"` High string `json:"high"` Fx string `json:"fx"` Low string `json:"low"` Fl string `json:"fl"` Type string `json:"type"` } `json:"yesterday"` City string `json:"city"` Aqi string `json:"aqi"` Forecast []struct { Date string `json:"date"` High string `json:"high"` Fengli string `json:"fengli"` Low string `json:"low"` Fengxiang string `json:"fengxiang"` Type string `json:"type"` } `json:"forecast"` Ganmao string `json:"ganmao"` Wendu string `json:"wendu"` } `json:"data"` Status int `json:"status"` Desc string `json:"desc"` } ``` 惊了, 写这个API的人有点厉害。。。 Fx, Fengxiang, Fl, Fengli

非常感谢

shenwei12303
shenwei12303 · #5 · 7年之前
channelchannel #1 回复

通过断言为 []interface{} 类型,然后遍历,每个元素,又断言为 map 当然,这种的,也可以通过定义结构体解析或者使用 https://github.com/tidwall/gjson 包

谢谢

heiy
heiy · #6 · 7年之前
channelchannel #1 回复

通过断言为 []interface{} 类型,然后遍历,每个元素,又断言为 map 当然,这种的,也可以通过定义结构体解析或者使用 https://github.com/tidwall/gjson 包

[]interface{}怎么断言啊,不是只有interface{}才可以断言吗

waini1110
waini1110 · #7 · 7年之前
heiyheiy #6 回复

#1楼 @channel []interface{}怎么断言啊,不是只有interface{}才可以断言吗

断言的不是interface,而是你要的类型

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传