首页 > 解决方案 > 一个结构的多个 Json 条目

问题描述

我有多个 JSON 文件,我想在 API 中进行一次调用。

以下是我的结构:

type Demo struct {
    ChannelID int      `json:"channelId"`
    SeriesName string  `json:"seriesName"`
}

我有 5 个 JSON 文件,我需要放入这个结构中,然后传递给 API 调用。

我怎么做?

这是我的代码:

func GetJson(search string) *models.Demo {
    jsonStruct := models.Demo{}
    assetIds := DecodeXml(search)
    for i := 0; i < len(assetIds); i++ {
        epgData, err := http.Get(assets.EpgUrl + fmt.Sprintf("%v", assetIds[i]))
        if err != nil {
            log.Fatal(err)
        }
        jsonData, err := ioutil.ReadAll(epgData.Body)
        if err != nil {
            log.Fatal(err)
        }           
        json.Unmarshal(jsonData, &jsonStruct)
    }
    return &jsonStruct
}

对于我的 API 调用,我使用 gin-gonic,代码如下:

type Search struct {
    Search string `form:"search"`
}


func main() {
    r := gin.Default()
    r.GET("/search", func(c *gin.Context) {
        var search Search
        if c.ShouldBind(&search) == nil {
            c.JSON(200, actions.GetJson(search.Search))
        }
    })

    r.Run()
}

有人有想法吗?

标签: jsongo

解决方案


您声明一个变量jsonStruct并反复覆盖其值。您应该创建一个Demo值切片并填充切片。

此代码示例使用并返回一个Demo值片段。

func GetJson(search string) []models.Demo {
    assetIds := DecodeXml(search)
    jsonStructs := make([]models.Demo, len(assetIds))
    for i := 0; i < len(assetIds); i++ {
        epgData, err := http.Get(assets.EpgUrl + fmt.Sprintf("%v", assetIds[i]))
        if err != nil {
            log.Fatal(err)
        }
        jsonData, err := ioutil.ReadAll(epgData.Body)
        if err != nil {
            log.Fatal(err)
        }           
        epgData.Body.Close()
        json.Unmarshal(jsonData, &jsonStructs[i])
    }
    return jsonStructs
}

推荐阅读