json - 如何从 http.Get 获取 JSON 响应

我正在尝试从网络读取 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: %v\n", data)
    os.Exit(0)
}

func main() {
    get_content()
}

最佳答案

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

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 调用的内容)。原因是默认客户端没有设置超时;如果远程服务器没有响应,那你的日子就不好过了。

https://stackoverflow.com/questions/17156371/

相关文章:

javascript - 将数据发布到 JsonP

c# - 无法使用 Json 序列化 Web API 中的响应

json - 带 json 参数的 curl GET 请求

javascript - JavaScript 可以连接 MySQL 吗?

ruby - 如何以正确的格式写入 JSON 文件

python - 如何将 XML 字符串转换为字典?

ruby-on-rails - 使用 Rails 和 HTTParty 将 JSON 发布到 API

python - 检查键是否存在并使用 Python 迭代 JSON 数组

javascript - 如何在 Javascript/HTML5 中解析 Excel (XLS)

json - JSON 值是否可以包含多行字符串