在 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}
虽然我可以解组一些值,但其他值只是空的,即 zone
或 graph
(但这些值在 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 数组转换为图形数组。
我正在尝试在 Golang 中解组一个 json,它看起来像这样:
{"graph":[[1650970800,1859857],[1650972600,1918183]...],"records":246544,"period":"24h","zone":"test.com","queries":93321}
虽然我可以解组一些值,但其他值只是空的,即 zone
或 graph
(但这些值在 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 数组转换为图形数组。