加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在Golang中获取JSON响应

发布时间:2020-12-16 18:05:18 所属栏目:大数据 来源:网络整理
导读:我试图从web读取JSON数据,但该代码返回空结果。我不知道我在这里做错了。 package mainimport "os"import "fmt"import "net/http"import "io/ioutil"import "encoding/json"type Tracks struct { Toptracks []Toptracks_info}type Toptracks_info struct {
我试图从web读取JSON数据,但该代码返回空结果。我不知道我在这里做错了。
package main

import "os"
import "fmt"
import "net/http"
import "io/ioutil"
import "encoding/json"

type Tracks struct {
    Toptracks []Toptracks_info
}

type Toptracks_info struct {
    Track []Track_info
    Attr  []Attr_info
}

type Track_info struct {
    Name       string
    Duration   string
    Listeners  string
    Mbid       string
    Url        string
    Streamable []Streamable_info
    Artist     []Artist_info
    Attr       []Track_attr_info
}

type Attr_info struct {
    Country    string
    Page       string
    PerPage    string
    TotalPages string
    Total      string
}

type Streamable_info struct {
    Text      string
    Fulltrack string
}

type Artist_info struct {
    Name string
    Mbid string
    Url  string
}

type Track_attr_info struct {
    Rank string
}

func get_content() {
    // json data
    url := "http://ws.audioscrobbler.com/2.0/?method=geo.gettoptracks&api_key=c1572082105bd40d247836b5c1819623&format=json&country=Netherlands"

    res,err := http.Get(url)

    if err != nil {
        panic(err.Error())
    }

    body,err := ioutil.ReadAll(res.Body)

    if err != nil {
        panic(err.Error())
    }

    var data Tracks
    json.Unmarshal(body,&data)
    fmt.Printf("Results: %vn",data)
    os.Exit(0)
}

func main() {
    get_content()
}
发布此处为未来的Google员工,因为这是排名在许多搜索与获取和解码JSON的顶部结果。

理想的方式是不使用ioutil.ReadAll,而是直接在阅读器上使用解码器。这里有一个很好的函数,它获取一个url并将其响应解码到目标结构上。

var myClient = &http.Client{Timeout: 10 * time.Second}

func getJson(url string,target interface{}) error {
    r,err := myClient.Get(url)
    if err != nil {
        return err
    }
    defer r.Body.Close()

    return json.NewDecoder(r.Body).Decode(target)
}

使用示例:

type Foo struct {
    Bar string
}

func main() {
    foo1 := new(Foo) // or &Foo{}
    getJson("http://example.com",foo1)
    println(foo1.Bar)

    // alternately:

    foo2 := Foo{}
    getJson("http://example.com",&foo2)
    println(foo2.Bar)
}

更新:因为这已经得到了相当多的关注,我想补充说,你不应该使用默认的* http.Client结构在生产中,因为这个答案最初演示! (这是什么http.Get / etc调用)。原因是默认客户端没有设置超时;如果远程服务器没有响应,你会有一个糟糕的一天。我更新了上面的答案。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读