使用Go Parse Json响应的Api请求

时间:2016-03-11 06:52:27

标签: json api go

编写我的第一个Go应用程序我正在学习进行基本的api调用并解析json响应。我很确定我没有正确地投射我的类型,我的回答是

false
  0
 0

  0
 0 false
 0

如果我创建一些包含数据的数组,我可以得到那个响应,但是当我将这个更复杂的json响应添加到混合时,事情变得更加混乱,这使我变得非常积极,我没有正确地投射。

这是我当前的代码,经过四处游戏并改变一些东西,以便打破东西并尝试解决问题。

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
) 
    type Payload struct {
        results Data 
}

    type Data struct {
        poster_path string
        adult bool
        overview string
        release_date string
        genre_ids int
        id int
        original_title string
        original_language string
        title string
        backdrop_path string
        popularity float64
        vote_count int
        video bool
        vote_average float64
}


type poster_path map[string]string
type adult map[string]bool
type overview map[string]string
type release_date map[string]string
type genre_ids map[string]int
type id map[string]int
type original_title map[string]string
type original_language map[string]string
type title map[string]string
type backdrop_path map[string]string
type popularity map[string]float64
type vote_count map[string]int
type video map[string]bool
type vote_average map[string]float64

func main() {
      // http://image.tmdb.org/t/p/w185
      url := "https://api.themoviedb.org/3/movie/top_rated?api_key=####APIKEYHERE######"
      res, err := http.Get(url)
      if err != nil {
        panic(err)
      }
      defer res.Body.Close()

      body, err := ioutil.ReadAll(res.Body)
      if err != nil {
        panic(err)
      }
      var p Payload

      err = json.Unmarshal(body, &p)
      if err != nil {
        panic(err)
      }

      fmt.Println(
        p.results.poster_path, "\n", p.results.adult,
        p.results.overview, "\n", p.results.release_date,
        p.results.genre_ids, "\n", p.results.id,
        p.results.original_title, "\n", p.results.original_language,
        p.results.title, "\n", p.results.backdrop_path,
        p.results.popularity, "\n", p.results.vote_count,
        p.results.video, "\n", p.results.vote_average,
        )
}

这就是JSON响应的样子,

{
    "page": 1,
    "results": [
        {
            "poster_path": "/lIv1QinFqz4dlp5U4lQ6HaiskOZ.jpg",
            "adult": false,
            "overview": "Under the direction of a ruthless instructor, a talented young drummer begins to pursue perfection at any cost, even his humanity.",
            "release_date": "2014-10-10",
            "genre_ids": [
                18,
                10402
            ],
            "id": 244786,
            "original_title": "Whiplash",
            "original_language": "en",
            "title": "Whiplash",
            "backdrop_path": "/6bbZ6XyvgfjhQwbplnUh1LSj1ky.jpg",
            "popularity": 9.685051,
            "vote_count": 1706,
            "video": false,
            "vote_average": 8.36
        }
}

一些突出的事情,

当我试图施放漂浮物时,我对从float32施放到float64

感到困惑

json响应中有一个数组,在尝试强制转换时会让人感到困惑,

"genre_ids": [
                36,
                18,
                53,
                10752
            ], 

2 个答案:

答案 0 :(得分:3)

常见的初学者错误。由于语言设计,encoding/json包只能解组到导出的字段

来自encoding/json包:

  

要将JSON解组为结构,Unmarshal将传入的对象键与   Marshal使用的键(结构字段名称或其标记),   更喜欢精确匹配,但也接受不区分大小写的匹配。    Unmarshal只会设置结构的导出字段。

要导出字段,只需使用名称的大写首字母即可。例如:

type Payload struct {
    Results Data 
}

而不是

type Payload struct {
    results Data 
}

答案 1 :(得分:0)

首先,您在JSON的]末尾缺少结束方括号results

其次,您没有根据收到的JSON构建结构。

最后,在处理Unmarshal / marshaling时,在结构中的每个导出字段之后使用JSON标记来帮助Go检测相应的字段(如果根据how Unmarshal/marshal identify fields命名字段,则不需要。

type Payload struct {
        Page    int
        Results []Data 
}

type Data struct {
        PosterPath       string  `json:"poster_path"`
        Adult            bool    `json:"adult"`
        Overview         string  `json:"overview"`
        ReleaseDate      string  `json:"release_date"`
        GenreIds         []int   `json:"genre_ids"`
        Id               int     `json:"id"`
        OriginalTitle    string  `json:"original_title"`
        OriginalLanguage string  `json:"original_language"`
        Title            string  `json:"title"`
        BackdropPath     string  `json:"backdrop_path"`
        Popularity       float64 `json:"popularity"`
        VoteCount        int     `json:"vote_count"`
        Video            bool    `json:"video"`
        VoteAverage      float64 `json:"vote_average"`
}

请注意,GenreIds必须[]int才能匹配JSON数据。不要在Go中使用CamelCase是一个好主意。

请参阅https://play.golang.org/p/VduPD9AY84