我正在尝试通过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}}
答案 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