在 Golang 中解组 json 时字符串为 nil

string is nil when unmarshaling json in Golang

我正在尝试在 Golang 中解组一个 json,它看起来像这样:

{"graph":[[1650970800,1859857],[1650972600,1918183]...],"records":246544,"period":"24h","zone":"test.com","queries":93321} 

虽然我可以解组一些值,但其他值只是空的,即 zonegraph(但这些值在 Json 中被 return 编辑)。这是我的代码

type NSoneResponse struct {
Graphs  []Graph
Records int64
Period  string
Zones   string
Queries int64
}

type Graph struct {
    Timestamp int64
    Queries   int64
}

const (
    zoneUsageUrl  = "https://api.nsone.net/v1/stats/usage/test.com?period=24h&networks=*"
)

func main() {
    getUsageData(zoneUsageUrl)
}

func getUsageData(url string) {
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        log.Fatal(err)
    }

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }

    var filteredData []NSoneResponse
    err = json.Unmarshal([]byte(body), &filteredData)
    if err != nil {
        panic(err)
    }

    for i := range filteredData {
        fmt.Printf("Quieries per timestamp: %v\nRecords count: %v\nPeriod: %v\nZone: %v\nNumber of queries: %v\n", filteredData[i].Graphs, filteredData[i].Records, filteredData[i].Period, filteredData[i].Zones, filteredData[i].Queries)

    }
}

最后的输出

Quieries per timestamp: []
Record count: 243066
Period: 24h
Zone:
Number of queries: 91612963

当我尝试在 NSoneResponse 结构中使用指针时,我得到了这些值的 nil(注意 - Period 键也包含字符串值,但它不 return nil)

Quieries per timestamp: <nil>
Quota count: 0xc000274470
Period: 0xc000460310
Zone: <nil>
Number of queries: 0xc000274488  

我做错了什么?

首先,我会解释你代码中的错误,你应该使用struct tags。因为你的结构的 Graphs 变量不等于 json 中的 graph,这个错误也在 zone 变量上。将您的结构更改为此:

type NSoneResponse struct {
    Graphs  [][]int `json:"graph"`
    Records int64   `json:"records"`
    Period  string  `json:"period"`
    Zones   string  `json:"zone"`
    Queries int64   `json:"queries"`
}

此外,您的 JSON 有一个 int 数组而不是一个对象数组,因此您必须更改 Graphs 的类型。之后,您应该将 int 数组转换为图形数组。