json - 如何将来自 HTTP Get 请求的数据存储在结构体 slice 中

标签 json go slice

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

如果我运行

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

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

我想迭代响应正文并将数据存储在名为 holidays 的结构体中,每个结构体将包含单个公共(public)假期的数据。由于某种原因,holidays 变量返回一个空 slice :[]

我想我的两个问题是:

  1. 将 json 数据转换为稍后使用的结构 slice 的最佳方法是什么?
  2. 为什么假期变量返回空 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/

相关文章:

go - 发出 `go install`时出错

interface - 如何实现可以接受可以在 golang 中进行相等性测试的任何类型的链表?

python - 如何切片 numpy 字符串数组的每个元素?

python - 在二维 Numpy 数组中切片非连续索引

.net - 在 Newtonsoft JSON 中,如何退回到默认转换行为/暂时禁用 JSON 转换器

javascript - 搜索并修改深度嵌套的 javascript 对象

java - NoClassDefFoundError : org/codehaus/jackson/Versioned using Jackson JSON parser

php - android 从 mysql 中检索数据并将其呈现在 recycleview 中并添加事件

go - 这三种创建DIY构造的方式有什么区别? [复制]

go - Go 语言中的 nil slice vs 非 nil slice vs 空 slice