2016-07-17 8 views
0

Я демаршаллизации Youtube ответ JSON в Go структуры, используя данные, полученные от Youtube API следующим образом: -Демаршаллизация 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" 
    } 
    } 
] 
} 

Чтобы сделать это, я создал STRUCT для этого в 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"` 
} 

Я unmarshaled его с помощью этого метода

youtubeData := YoutubeData{} 

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

} else { 

} 

В которой b - данные байта, полученные от API Youtube. Я успешно получил все данные в объекте байт, как я напечатал его на моей консоли, однако, как только я unmarshaled его и попытался вывести его на шаблон с помощью {{.}}, Я получил

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

Все данные немаршалируются, за исключением данных в объекте и массиве json, которые являются страницами и элементами. Они просто пусты. Я считаю, что я правильно их экспортировал. Существуют ли какие-то дополнительные шаги для того, чтобы получить данные в срез или структуру, вложенные внутри другой структуры в Go, когда дело доходит до json unmarshalling?

ответ

1

Обратите внимание, что данные json содержат цифры для TotalResults и ResultsPerPage. Вы можете попробовать декодировать эти следующим образом:

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

После того как вы unmarshalled-структуру, вы можете получить номер как:

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

Я понял это, что, когда я использую автогенерируемая JSON, чтобы перейти от

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

Теперь он отлично работает. Я никогда не буду вручную вручную его вручную.

1

Ваша структура должна иметь поля с одинаковыми типами данных JSON тело имеет в своем теле JSON totalResults и resultsPerPage являются целыми числами, так:

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