如何解决JSON数据在这个程序中打印出来?
我试图通过api url将数据转换为JSON数据。总的来说,它是可以工作的,但是当我想从JSON获取特定的数据集时(这里我尝试的是MyStruct,它是一个包含名称、持续时间和列表名的数据集),所以结果是空的。另一方面,html模板也存在同样的问题,当我通过本地主机端口调用它时,它不会给出任何结果。 我已经声明了一个全局实例来调用模板函数中的数据集(不过也可以在我的get content函数中使用),但结果失败。 我想知道为什么get_内容中的数据变量的结果为空如何解决JSON数据在这个程序中打印出来?,json,go,Json,Go,我试图通过api url将数据转换为JSON数据。总的来说,它是可以工作的,但是当我想从JSON获取特定的数据集时(这里我尝试的是MyStruct,它是一个包含名称、持续时间和列表名的数据集),所以结果是空的。另一方面,html模板也存在同样的问题,当我通过本地主机端口调用它时,它不会给出任何结果。 我已经声明了一个全局实例来调用模板函数中的数据集(不过也可以在我的get content函数中使用),但结果失败。 我想知道为什么get_内容中的数据变量的结果为空 // created struc
// 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 stringjson:“Country”
Page stringjson:“Page”
PerPage stringTotalPages stringjson:“TotalPages”
Total stringjson:“Total”
}键入Data2 struct{Content2 struct{Attrs[]Attr_infojson:“Attr_info”
}}(新)谢谢@Mark!但当我试图创建更多类型结构时,我又被卡住了(和你们一样),但程序突然结束,终端上没有任何输出。我已经将我的工作放在了golang链接上(由于网站错误,我无法放置数据)你的思路正确(没有双关语的意思…!这里是另一个显示嵌套结构的视图。值得花时间在文档上。