编写我的第一个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
],
答案 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是一个好主意。