为了账号安全,请及时绑定邮箱和手机立即绑定

带有 Go Parse Json 响应的 Api 请求

带有 Go Parse Json 响应的 Api 请求

Go
慕侠2389804 2021-12-20 16:44:58
编写我的第一个 Go 应用程序我正在学习进行基本的 api 调用并解析 json 响应。我很确定我没有正确投射我的类型,我的回应是false  0 0  0 0 false 0如果我创建一些包含数据的数组,我可以获得该响应,但是当我将这个更复杂的 json 响应添加到混合中时,事情会变得更加混乱,这让我非常肯定我没有正确投射。这是我在玩弄并更改内容以破坏内容并尝试解决问题之后的当前代码。package mainimport (    "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]stringtype adult map[string]booltype overview map[string]stringtype release_date map[string]stringtype genre_ids map[string]inttype id map[string]inttype original_title map[string]stringtype original_language map[string]stringtype title map[string]stringtype backdrop_path map[string]stringtype popularity map[string]float64type vote_count map[string]inttype video map[string]booltype vote_average map[string]float64func 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)      }}一些让我印象深刻的事情,当我尝试投射浮点数时,我对投射 from float32to感到困惑float64
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

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


从encoding/json包:


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


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


type Payload struct {

    Results Data 

}

代替


type Payload struct {

    results Data 

}


查看完整回答
反对 回复 2021-12-20
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

首先,您在 JSON]的末尾缺少一个右方括号results。


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


最后,在处理 Unmarshal/marshaling 时,在结构中每个导出字段后使用 JSON 标记以帮助 Go 检测适当的字段(如果您根据Unmarshal/marshal 识别字段的方式命名字段,则不需要。


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


查看完整回答
反对 回复 2021-12-20
  • 2 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信