post Image
APIライブラリをgo-json(改)で楽に実装する

はじめに

vimeoのAPIライブラリを実装したときに便利だったgo-jsonの紹介と問題点、その改良について書きます。

使いどころ

以下の条件が揃ったとき、go-jsonのありがたみが感じられます。

  • APIクライアントを実装する必要がある
  • レスポンスのタイプがJSONである
  • APIのレスポンス内容が多い
  • レスポンスのサンプル値が簡単に手に入る

使い方

まずは通常通りインストール

$ go get github.com/ChimeraCoder/gojson/gojson

ドキュメント等からJSONのレスポンス値を集め

$ ls *.json
group.json    list.json    me.json    video.json

go-jsonで構造体を一括生成します
-pkgはpackage名、-nameは構造体名、-input変換元のJSONファイル、-oで出力先です

generate-struct.sh
for f in $(ls); do 
  name=$(echo $f|sed 's/.json//g')
  gojson -subStruct true -pkg vimeo -name ${name^} -input $f -o ${name}.go
done

また、生成時に-subStructオプションをtrueにしているので
ネストしているJSONは、Size struct{...}ではなく別の構造体に分割されます

video.json
{
  "id": "2321232",
  "created_at": "2016/12/24",
  "size": {
    "width": 400,
    "height": 860
  }
}
video.go
package vimeo

type Video struct {
    CreatedAt string     `json:"created_at"`
    ID        string     `json:"id"`
    Size      Video_sub1 `json:"size"`
}

type Video_sub1 struct {
    Height int64 `json:"height"`
    Width  int64 `json:"width"`
}

問題点

動作には何も問題がなかったのですが、私の用途では以下の点で構造体の出力形式が不十分でした。

その1
ネストしたJSONを分割して出力できるのは良いのですが、生成される名前が${nameで指定した名前}_sub${counter}のため、
構造体の名前を一つづつ正しいものに直していかなければならない。
https://github.com/ChimeraCoder/gojson/blob/6039f74e19c1090f88a75f74700b72e539717a22/json-to-struct.go#L301

その2
ネストしたJSONの中には、中身が同一のものが存在するため重複して定義されてしまう。
また、重複して定義されていることを確認する方法が目grepしかなかった。

改良

1つ目は、多くの場合ネストする構造体の名前は呼び出し元の名前と一致するので呼び出し元の名前を使うように修正。
2つ目については、go-json側に実装すると別物になってしまうので
ネストする構造体の出力ファイルを別ファイルに吐き出し、構造体の生成後にdiffコマンドを使う手を取りました。

実際の修正内容はこんな感じ。
https://github.com/Ladicle/gojson/pull/1/files
これを先ほどのvideo.jsonに対して実行すると2つのファイルが吐き出されます。

00_video.go
package vimeo

type Video struct {
    CreatedAt string `json:"created_at"`
    ID        string `json:"id"`
    Size      Size   `json:"size"`
}
01_video.go
package vimeo

type Size struct {
    Height int64 `json:"height"`
    Width  int64 `json:"width"`
}

はっぴー( ・⊝・ )

おわりに

今回は構造体に焦点を当てましたが、
実装時にはリクエストの生成やエラーハンドリング、パッケージ分割などにも悩みました。
そんな時に参考にしたのは以下のライブラリです。特にstripeはコンパクトで読みやすいのでオススメです。


『 Go 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。