DRYな備忘録

Don't Repeat Yourself.

GolangでOAuthしてTwitterのscreen_nameがjson decodeで取れないでござる【Twitter OAuth】【golang】

問題

 golangのoauthモジュールとか使って楽々TwitterAPI生活したいじゃないですがgolangで。でOAuthは簡単に実装できたんだけど、ログインユーザのscreen_name取ろうとして取れない。

結論から言うとencoding/jsonの使い方だった

f:id:otiai10:20140113185433j:plain

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な備忘録