如何解决JSON数据在这个程序中打印出来?

如何解决JSON数据在这个程序中打印出来?,json,go,Json,Go,我试图通过api url将数据转换为JSON数据。总的来说,它是可以工作的,但是当我想从JSON获取特定的数据集时(这里我尝试的是MyStruct,它是一个包含名称、持续时间和列表名的数据集),所以结果是空的。另一方面,html模板也存在同样的问题,当我通过本地主机端口调用它时,它不会给出任何结果。 我已经声明了一个全局实例来调用模板函数中的数据集(不过也可以在我的get content函数中使用),但结果失败。 我想知道为什么get_内容中的数据变量的结果为空 // created struc

我试图通过api url将数据转换为JSON数据。总的来说,它是可以工作的,但是当我想从JSON获取特定的数据集时(这里我尝试的是MyStruct,它是一个包含名称、持续时间和列表名的数据集),所以结果是空的。另一方面,html模板也存在同样的问题,当我通过本地主机端口调用它时,它不会给出任何结果。 我已经声明了一个全局实例来调用模板函数中的数据集(不过也可以在我的get content函数中使用),但结果失败。 我想知道为什么get_内容中的数据变量的结果为空

// 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}}

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

下面是一个基于您给出的url响应的示例。响应被减少到适合这里,完整响应在屏幕上

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)
    }
}
正文
替换为完整的json(例如,来自url响应)并运行此命令将打印:

Track:Hello
我感觉不到我的脸
曲目:摇摆苏丹
曲目:对不起
轨道:依靠(专长MØ&DJ蛇)
轨道:我知道的越少越好
曲目:非洲
...

该url的json以
{“tracks”:{“track”:[{“name”:“Hello”,“duration”:“0”,…
开头。相应的go结构传递给json。Unmarshal必须具有类似的结构。感谢回复。是的,我有完整的代码,代码稍微长一点,因此我希望关注失败结果(空白)因为我必须打印出一个特定的数据集,所以在MyStruct中它包含变量(分别是名称、持续时间、侦听器、mbid和url)另外请注意,您正在为
/
注册多个处理程序。这是不允许的。您的真实代码看起来是一样的?是的,看起来是一样的。事实上,我对golang是新手,但正在尝试学习它。我必须打印不同的数据集,例如,我有不同的类型结构,包含不同的变量来表示JSON数据。因此,我尝试编写functions并将这些结构调用到它们中。我担心它可能会失败,但不知道如何解决!(如果您愿意,我可以共享整个代码)谢谢@Mark!但当我尝试创建更多类型结构时,我又被卡住了(和您一样)但程序突然结束,终端上没有任何输出。例如:键入Attr_info struct{Country string
json:“Country”
Page string
json:“Page”
PerPage string
TotalPages string
json:“TotalPages”
Total string
json:“Total”
}键入Data2 struct{Content2 struct{Attrs[]Attr_info
json:“Attr_info”
}}(新)谢谢@Mark!但当我试图创建更多类型结构时,我又被卡住了(和你们一样),但程序突然结束,终端上没有任何输出。我已经将我的工作放在了golang链接上(由于网站错误,我无法放置数据)你的思路正确(没有双关语的意思…!这里是另一个显示嵌套结构的视图。值得花时间在文档上。