【发布时间】:2016-04-24 12:06:38
【问题描述】:
我正在尝试一个相当简单的示例,尝试使用 golang 将 JSON 文件解码为一些结构。但是,当我尝试得到错误时,
json: 无法将对象解组为 []main.Track
类型的 Go 值
我不明白。这是有问题的代码,JSON 可以是found here。
package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
// Tracks a group of Track types
type Tracks struct {
Tracks []Track
}
// Track represents a singular track
type Track struct {
Name string
URL string
Artist Artist
}
// Artist represents a single artist
type Artist struct {
Name string
MBID string
URL string
}
func main() {
url := "http://ws.audioscrobbler.com/2.0/?method=geo.gettoptracks&api_key=c1572082105bd40d247836b5c1819623&format=json&country=Netherlands"
response, err := http.Get(url)
if err != nil {
fmt.Printf("%s\n", err)
os.Exit(1)
}
defer response.Body.Close()
var tracks Tracks
decodeErr := json.NewDecoder(response.Body).Decode(&tracks)
if decodeErr != nil {
fmt.Printf("%s\n", decodeErr)
os.Exit(1)
}
for _, track := range tracks.Tracks {
fmt.Printf("%s: %s\n", track.Artist.Name, track.Name)
}
}
我最初的想法是,也许您需要使用结构对每个 JSON 值进行分类,但我没有这样做,但在阅读 this article 时说:
对此有两个答案。当您知道您的数据会是什么样子时,最简单的选择是将 JSON 解析为您定义的结构。 任何不适合结构的字段都将被忽略。我们将首先介绍该选项。
这让我相信事实并非如此。
在这种情况下我做错了什么?
【问题讨论】:
-
如果您想避免此类问题,您可以尝试使用json-to-go tool。它基本上将 json 转换为类型定义。