如何将来自 HTTP Get 请求的数据存储在结构片中

How to store data from a HTTP Get request in a slice of structs

提问人:lemonsrule101 提问时间:8/8/2022 最后编辑:lemonsrule101 更新时间:8/8/2022 访问量:803

问:

问题我是 Go 的新手,我正在尝试将 json 数据存储在 Gov.uk public holidays API 的结构中,以便我稍后可以在前端使用它。

如果我跑

var sb = string(body)
fmt.Println(sb)

我可以看到终端中返回的数据。我知道响应正文由字节组成,上面将其转换为字符串。

我想遍历响应正文并将数据存储在一个名为 的结构体切片中,每个结构体将包含单个公共假日的数据。出于某种原因,holidays 变量返回一个空切片:。holidays[]

我想我的两个问题是:

  1. 将 json 数据转换为结构切片以供以后使用的最佳方法是什么?
  2. 为什么 holidays 变量返回一个空切片?

谢谢!

这是我的代码如下: 包主

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)

}
JSON Go 切片

评论

1赞 Brits 8/8/2022
您的 与 API 返回的 JSON 结构不匹配(API 返回的对象具有类似 的键,而不是数组)。尝试将返回的数据粘贴到此站点中,以了解您的数据应该是什么样子。struct"england-and-wales"struct
1赞 Hymns For Disco 8/8/2022
与其使用它,不如直接用io.ReadAlljson.NewDecoder(resp.Body)

答:

2赞 Qasim Sarfraz 8/8/2022 #1

我必须调整响应以处理正确的数据解组。在下面找到工作代码: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)
        }

    }

}
0赞 mo1ein 8/8/2022 #2

因为你的 json 字段必须与你的结构相匹配。

type Response map[string]Data

type Data struct {
    Division string  `json:"division"`
    Events   []Event `json:"events"`
}

type Event struct {
    Title   string `json:"title"`
    Date    string `json:"date"`
    Notes   string `json:"notes"`
    Bunting bool   `json:"bunting"`
}