問題
golangのoauthモジュールとか使って楽々TwitterAPI生活したいじゃないですがgolangで。でOAuthは簡単に実装できたんだけど、ログインユーザのscreen_name取ろうとして取れない。
結論から言うとencoding/jsonの使い方だった
3時間くらい詰まったがな...
ソースコード(動かない)
// TWITTERは*oauth.Consumerです // @see http://godoc.org/github.com/mrjones/oauth resp, _ := TWITTER.Get( "https://api.twitter.com/1.1/account/verify_credentials.json", map[string]string{}, // userは独自のモデル // User{ *oauth.RequestToken, *oauth.AccessToken } user.AccessToken, ) defer resp.Body.Close() // encoding/jsonパッケージを使って // 明示的にjsonのフィールドをstructに対応させるときは // 行末に`json:fieldname`を書く account := struct { Description string `json:description` ScreenName string `json:screen_name` Name string `json:name` }{} _ = json.NewDecoder(resp.Body).Decode(&account) fmt.Printf("とれてる?\t%+v", account)
けっか
とれてる? {Description:知らぬい ScreenName: Name:ᔆᵘᙚᑋⁱ}
見事にscreen_name
だけとれてない
解決
account := struct { Description string `json:description` // ScreenName string `json:screen_name` ダメ // ScreenName string `json:screenName` ダメ ScreenName string `json:"screen_name"`//正解 Name string `json:name` }{}
けっか
とれてる? {Description:知らぬい ScreenName:otiai10 Name:ᔆᵘᙚᑋⁱ}
とれてる
まとめ
- encoding/jsonで明示的にjsonのフィールドをstructのフィールドに対応させるときは、必ずjsonフィールド名をダブルクオートで囲む
- なぜなら、そうしないとjsonフィールド名がスネークケースの場合ちゃんとデコードして入れて入れてくれないから!
- (´-`).。oO( じゃあスネークケースじゃなくてもダブルクオートで囲まないといけなようにしといてよ...!
- (´-`).。oO( ...
DRYな備忘録