如何解决此程序中打印的JSON数据?

时间:2018-04-24 08:16:53

标签: json go

我正在尝试通过api url将数据转换为JSON数据。总的来说它可以工作,但是当我想从JSON获取特定数据集时(这里我正在尝试MyStruct,这是一个具有名称,持续时间,列表器的数据集),因此它带有空白结果。另一方面,html模板的问题与我通过本地主机端口调用时没有给出任何结果相同。 我已经声明了一个全局实例来调用模板函数中的数据集(虽然也可以在我的获取内容函数中使用)但是结果失败了。 我想知道为什么get_content中的数据变量有空白结果?

// created structurs example
type MyStruct struct {
    Name       string
    Duration   string
    and so on..
}
var data1 MyStruct

// function to retreive api data & convert into json.
func get_content() {
    // json data
    url := "http://ws.audioscrobbler.com/2.0/?method=geo.gettoptracks&api_key=c1572082105bd40d247836b5c1819623&format=json&country=Netherlands"
    url += "" // limit data for testing
    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 MyStruct
    err = json.Unmarshal(body, &data)
    if err != nil {
        panic(err.Error())
    }
    fmt.Printf("Results: %v\n", data)
}

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        get_content()
    })

    http.HandleFunc("/", template1)
    http.ListenAndServe(":8080", nil)

}

func template1(w http.ResponseWriter, r *http.Request) {

    fp := path.Join("index.html")
    tmpl, err := template.ParseFiles(fp)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    if err := tmpl.Execute(w, data1); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}

在索引文件上我写了名称来调用数据:

{{.Name}}
{{.Duration}}
{{.Listeners}}

1 个答案:

答案 0 :(得分:1)

为了更明确一点,go数据结构必须与json数据结构匹配。不仅仅是个人跟踪,而是整个json结构。

以下是基于您提供的网址响应的示例。响应减少到适合此处,完整响应位于Playground

json结构返回的名称具有误导性,但它是可行的。

"code.3, code.4, code.1, code.2"

用完整的json替换package main import ( "encoding/json" "fmt" "log" ) type Track struct { Name string `json:"name"` Duration string `json:"duration"` //... etc } type Data struct { Content struct { Tracks []Track `json:"track"` } `json:"tracks"` } func main() { var body = []byte(`{ "tracks":{ "track":[ { "name":"Hello", "duration":"123", "listeners":"373721", "mbid":"" } ] } }`) var data Data err := json.Unmarshal(body, &data) if err != nil { log.Fatal(err) } for _, track := range data.Content.Tracks { fmt.Printf("Track: %s\n", track.Name) } } (例如,从url响应中)并运行此打印:

body