json - 为什么 Go 在尝试编码此 JSON 时出错?

标签 json go struct

我正在尝试一个相当简单的示例,尝试使用 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/

相关文章:

Python在JSON结构中获取 sibling

go - 为 Tensorflow 构建 Go 绑定(bind)时出错

go - 是否可以在另一个包中实现具有未导出方法的接口(interface)?

c++ - 从 struct children 中调用的函数

PHP - 迭代文件并分解 JSON 文本 block

javascript - 从 PHP 获取 json 数据到我的 JavaScript 中以进行 float

java - 为什么我的 JSONObject(String) 返回空?

http - 如何在 golang 中修复 'http: named cookie not present'?

c++ - 构造函数导致 "use of deleted function"错误

c - 如何将具有两个无符号短裤的结构视为无符号整数? (在 C 中)