【问题标题】:Returning JSON array into Struct Golang将 JSON 数组返回到 Struct Golang
【发布时间】:2018-10-23 15:08:19
【问题描述】:

我的主要目标是将 JSON 对象传回给客户端。但是,我的结构中不断得到 nil 或空值。如何获得预期和期望的 JSON 数组响应?下面是我的代码sn-p。

package main

import (
    "net/http"
    "fmt"
    "encoding/json"
)

type News struct {
    NewsID      int     `json:"newsId"`
    PlayerID    int     `json:"playerId"`
    TeamID      int     `json:"teamId"`
    Team        string  `json:"team"`
    Title       string  `json:"title"`
    Content     string  `json:"content"`
    Url         string  `json:"url"`
    Source      string  `json:"source"`
    TermsOfUse  string  `json:"terms"`
    Updated     string  `json:"updated"`
}

func GetBoxScore (w http.ResponseWriter, r *http.Request) {
    news := News{}
    req, _ := http.NewRequest("GET","https://api.fantasydata.net/v3/nhlpb/scores/JSON/News", nil)
    req.Header.Set("Ocp-Apim-Subscription-Key", "API KEY")
    req.Host = "api.fantasydata.net"
    client := &http.Client{}
    res, err := client.Do(req)
    defer res.Body.Close()

    if err != nil {
        fmt.Printf("The HTTP request failed with error %s\n", err)
    }
    err = json.NewDecoder(r.Body).Decode(&news)
    newsJson, err := json.Marshal(news)
    if err != nil {
        panic(err)
    }
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusAccepted)
    w.Write(newsJson)
}

目前,响应是我的空 News 结构,所有的值都是 nil。我想要并期待的回应如下:

  [
        {
            "NewsID": 8919,
            "PlayerID": 30003647,
            "TeamID": 28,
            "Team": "VAN",
            "Title": "Rumors have Elias Pettersson back this week",
            "Content": "The rumor mill has Elias Pettersson (concussion) returning this week.",
            "Url": "http://www.rotoworld.com/player/nhl/5819/elias-pettersson",
            "Source": "NBCSports.com",
            "TermsOfUse": "NBCSports.com feeds in the RSS format are provided free of charge for use by individuals for personal, non-commercial uses. More details here: http://fantasydata.com/resources/rotoworld-rss-feed.aspx",
            "Updated": "2018-10-21T11:54:00"
        },
        {
            "NewsID": 8918,
            "PlayerID": 30000294,
            "TeamID": 10,
            "Team": "NJ",
            "Title": "Cory Schneider gives up three in AHL loss",
            "Content": "Cory Schneider (hip) played for the first time this season, albeit in the AHL.",
            "Url": "http://www.rotoworld.com/player/nhl/2139/cory-schneider",
            "Source": "NBCSports.com",
            "TermsOfUse": "NBCSports.com feeds in the RSS format are provided free of charge for use by individuals for personal, non-commercial uses. More details here: http://fantasydata.com/resources/rotoworld-rss-feed.aspx",
            "Updated": "2018-10-21T08:01:00"
        }, 
]

【问题讨论】:

  • 代码中的Decode 没有填充新闻结构。如果您在err = json.NewDecoder(r.Body).Decode(&news) 之后打印新闻变量,您将看到这一点。这可能是因为 response.Body 中的 json 与您预期的不同。尝试打印出response.Body 缓冲区的内容。

标签: json go


【解决方案1】:

我在这里要提到两件事。首先,您是否得到了预期的响应?你可能想检查一下。

第二个,你提供的 json 是一个新闻数组,而不是一个新闻。您可能希望将新闻类型更改为数组而不是单个新闻。

type NewsItem struct {
    NewsID      int     `json:"newsId"`
    PlayerID    int     `json:"playerId"`
    TeamID      int     `json:"teamId"`
    Team        string  `json:"team"`
    Title       string  `json:"title"`
    Content     string  `json:"content"`
    Url         string  `json:"url"`
    Source      string  `json:"source"`
    TermsOfUse  string  `json:"terms"`
    Updated     string  `json:"updated"`
}

type News []NewsItem

【讨论】:

    【解决方案2】:

    在下面一行

    err = json.NewDecoder(r.Body).Decode(&news)
    

    您正在传递新闻结构,因为 json 实际上是一个数组。因此,您需要创建一个新闻结构片段,然后将其传递。

    newsList := make([]News,0)
    err = json.NewDecoder(r.Body).Decode(&newsList)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 2022-12-29
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2014-06-11
      相关资源
      最近更新 更多