将嵌套数组和对象的JSON数据解组为Go struct

时间:2016-07-17 11:56:44

标签: arrays json go youtube unmarshalling

我使用从Youtube API收到的数据将Youtube json响应解组为Go结构,如下所示: -

{
 "kind": "youtube#searchListResponse",
 "etag": "\"5g01s4-wS2b4VpScndqCYc5Y-8k/5xHRkUxevhiDF1huCnKw2ybduyo\"",
 "nextPageToken": "CBQQAA",
 "regionCode": "TH",
 "pageInfo": {
  "totalResults": 36,
  "resultsPerPage": 20
 },
 "items": [
  {
   "kind": "youtube#searchResult",
   "etag": "\"5g01s4-wS2b4VpScndqCYc5Y-8k/aMbszoNudZchce3BIjZC_YemugE\"",
   "id": {
    "kind": "youtube#video",
    "videoId": "fvh6CQ7FxZE"
   },
   "snippet": {
    "publishedAt": "2016-07-16T14:42:36.000Z",
    "channelId": "UCuX4iswo8acMxDNcbrceRYQ",
    "title": "Japan อร่อยสุดๆ:การประชันของ 2 สาวกับราเมงดังจากโอซาก้า#ramen",
    "description": "Ramen Kio ราเมนชื่อดังของโอซาก้าอัดแน่นด้วยเนื้อหมูชาชูแบบเต็มๆเส้นเหนีย...",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/fvh6CQ7FxZE/default.jpg",
      "width": 120,
      "height": 90
     },
     "medium": {
      "url": "https://i.ytimg.com/vi/fvh6CQ7FxZE/mqdefault.jpg",
      "width": 320,
      "height": 180
     },
     "high": {
      "url": "https://i.ytimg.com/vi/fvh6CQ7FxZE/hqdefault.jpg",
      "width": 480,
      "height": 360
     }
    },
    "channelTitle": "Japan aroi sudsud TV",
    "liveBroadcastContent": "none"
   }
  }
 ]
}

为此,我在Go

中为此创建了一个结构
type YoutubeData struct {
    Kind          string `json:"kind"`
    Etag          string `json:"etag"`
    NextPageToken string `json:"nextPageToken"`
    RegionCode    string `json:"regionCode"`
    PageInfo      struct {
        TotalResults   string `json:"totalResults"`
        ResultsPerPage string `json:"resultsPerPage"`
    } `json:"pageInfo"`
    Items []struct {
        Kind string `json:"kind"`
        Etag string `json:"etag"`
        Id   struct {
            Kind    string `json:"kind"`
            VideoId string `json:"videoId"`
        } `json:"id"`
        Snippet struct {
            PublishedAt string `json:"publishedAt"`
            ChannelId   string `json:"channelId"`
            Title       string `json:"title"`
            Description string `json:"description"`
            Thumbnails  struct {
                Default struct {
                    Url    string `json:"url"`
                    Width  string `json:"width"`
                    Height string `json:"height"`
                } `json:"default"`
                Medium struct {
                    Url    string `json:"url"`
                    Width  string `json:"width"`
                    Height string `json:"height"`
                } `json:"medium"`
                High struct {
                    Url    string `json:"url"`
                    Width  string `json:"width"`
                    Height string `json:"height"`
                } `json:"high"`
            } `json:"thumbnails"`
            ChannelTitle         string `json:"channelTitle"`
            LiveBroadcastContent string `json:"liveBroadcastContent"`
        } `json:"snippet"`
    } `json:"items"`
}

我使用此方法解组了它

youtubeData := YoutubeData{}

if json.Unmarshal(b, &youtubeData); err != nil {

} else {

} 

其中b是从Youtube API接收的字节数据。当我将其打印到我的控制台时,我成功地获取了字节对象中的所有数据,但是,一旦我解组它并尝试使用{{。}}在模板上输出它,我收到了

{youtube#searchListResponse "5g01s4-wS2b4VpScndqCYc5Y-8k/JwGY0TWwWswjZ9LOvemaF5yxsMo" CBQQAA TH { } []}

除了json对象和数组中的数据 pageInfo items 之外,所有数据都是未编组的。根本就是空白。我相信我正确地导出了它们。当谈到json unmarshalling时,还有一些额外的步骤可以将数据放入切片或结构嵌套在Go中的另一个结构中吗?

3 个答案:

答案 0 :(得分:3)

当我使用自动生成的json来自

时,我想通了

https://mholt.github.io/json-to-go/

现在它完美无缺。我再也不会手工制作它了。

答案 1 :(得分:1)

请注意,json数据包含TotalResultsResultsPerPage的数字。您可以尝试按如下方式解码这些:

PageInfo      struct {
    TotalResults   json.Number `json:"totalResults"`
    ResultsPerPage json.Number `json:"resultsPerPage"`
} `json:"pageInfo"`

获得unmarshalled结构后,您可以将数字设为:

totalResults, _ := youtubeData.PageInfo.TotalResults.Int64()

答案 2 :(得分:1)

您的结构必须包含JSON正文所具有的相同数据类型的字段,在您的JSON正文中success-1totalResults是整数,所以:

resultsPerPage