问题 我是 Go 新手,我正在尝试将 json 数据存储在 Gov.uk public holidays API 的结构中。 ,这样我稍后就可以在我的前端中使用它。
如果我运行
var sb = string(body)
fmt.Println(sb)
我可以看到终端中返回的数据。我知道响应正文由字节组成,上面将其转换为字符串。
我想迭代响应正文并将数据存储在名为 holidays
的结构体中,每个结构体将包含单个公共(public)假期的数据。由于某种原因,holidays 变量返回一个空 slice :[]
。
我想我的两个问题是:
- 将 json 数据转换为稍后使用的结构 slice 的最佳方法是什么?
- 为什么假期变量返回空 slice ?
谢谢!
下面是我的代码: 包主要
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
)
type Response struct {
Data []Data
}
type Data struct {
Division string
Bankholiday Bankholiday
}
type Bankholiday struct {
Title string
Date string
}
func main() {
resp, err := http.Get("https://www.gov.uk/bank-holidays.json")
if err != nil {
log.Fatal(err)
}
if resp.Body != nil {
defer resp.Body.Close()
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalln(err)
}
var response Response
json.Unmarshal(body, &response)
var holidays = []Bankholiday{}
for _, date := range response.Data {
holidays = append(holidays, Bankholiday{
Title: date.Bankholiday.Title,
Date: date.Bankholiday.Date,
})
}
fmt.Println("holidays: ", holidays)
}
最佳答案
我必须调整响应struct
来处理正确的数据解码。找到下面的工作代码:
package main
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
)
type Response map[string]Data
type Data struct {
Division string `json:"division"`
Events []struct {
Title string `json:"title"`
Date string `json:"date"`
Notes string `json:"notes"`
Bunting bool `json:"bunting"`
} `json:"events"`
}
func main() {
resp, err := http.Get("https://www.gov.uk/bank-holidays.json")
if err != nil {
log.Fatal(err)
}
if resp.Body != nil {
defer resp.Body.Close()
}
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatalln(err)
}
var response Response
if err = json.Unmarshal(body, &response); err != nil {
log.Fatalln(err)
}
for div, _ := range response {
for _, event := range response[div].Events {
fmt.Printf("Division=%s, Holiday=%s, Date=%s\n", div, event.Title, event.Date)
}
}
}
关于json - 如何将来自 HTTP Get 请求的数据存储在结构体 slice 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73270873/