将JSON数组返回到Struct Golang

时间:2018-10-21 20:35:49

标签: json go

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

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"
        }, 
]

2 个答案:

答案 0 :(得分:6)

我在这里要提到两件事。首先,您是否得到了期望的答复?您可能要检查一下。

第二,您提供的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

答案 1 :(得分:1)

在下一行

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

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

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