我正在尝试一个相当简单的示例,尝试使用 golang 将 JSON 文件解码为某些结构。但是,当尝试我得到的错误是
json: cannot unmarshal object into Go value of type []main.Track
我不明白。这是有问题的代码,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 后其中说:
There are two answers to this. The easy option, for when you know what your data will look like, is to parse the JSON into a struct you’ve defined. Any field which doesn’t fit in the struct will just be ignored. We’ll cover that option first.
这让我相信事实并非如此。
在这种情况下我做错了什么?
最佳答案
如果查看查询响应的 JSON 结构,您会发现返回了一个具有 tracks
属性的对象。
{
"tracks": {
"track": [ {...} ]
}
}
如果将其与给定的结构进行比较,您会发现该结构没有对齐。您给定的 Tracks
结构有一个字段,它是 Track
的一部分。如果我将其转换为 JSON,它将表示为以下内容。
{
"tracks": [ { ... } ]
}
这是你错误的根源。 JSON 解码器期望根 JSON 对象的 tracks
字段是一个数组。返回的是一个包含 tracks
属性的对象,但它的值是另一个包含 track
属性的 JSON 对象,该属性是轨道数组.您可以更新您的结构以反射(reflect)此模式,如下所示。
// A response object from the API
type Response struct {
Tracks Tracks
}
// Tracks a group of Track types
type Tracks struct {
Track []Track
}
// Track represents a singular track
type Track struct {
Name string
URL string
Artist Artist
}
关于json - 为什么 Go 在尝试编码此 JSON 时出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36818212/