きょこみのーと

技術に関係ないほうのブログ

golangでjson用のstructを生成するGo製ツール(gojson)

Goでjsonのデータを扱う機会は多いのですが、 その度にjson:"hogehoge"を書くのがめんどくさいなーと思ってました。

jsonのI/Fが決まってるならそこからgoのコード生成すればいいかなと思い、作る前に類似ツールがないか調べていたら、すでに丁度いいのがあって便利だったので紹介したいと思います。

ChimeraCoder/gojson

ChimeraCoder/gojson · GitHub

install

$ go get github.com/ChimeraCoder/gojson

使い方

大きく2パターン?もっとありそうです。

  • catとかでローカルのjsonを渡す
  • curl等で受け取ったjsonレスポンスを渡す

ローカルにjsonがある場合

hoge.json

{
    "id": 1111111111,
    "name": "kyokomi",
    "full_name": "kyokomi/kyokomi"
}

普通にcat等でパイプで渡してやるといい感じです。

$ cat test/star.json | gojson -pkg=main -name=Starred > starred.go

引数の意味

  • -pkg パッケージ名
  • -name structの名前

出力結果

実行結果は標準出力されるので、そのまま.goとかに書き込めばいい感じになります。

package main

type Hoge struct {
    FullName string  `json:"full_name"`
    ID       float64 `json:"id"`
    Name     string  `json:"name"`
}

curlでパイプするのも可能

便利です。他にも色々使えそう。

curlする

$ curl https://api.github.com/users/kyokomi | gojson -pkg=main -name=GitHubUser

実行結果

package main

type GitHubUser struct {
    AvatarURL         string      `json:"avatar_url"`
    Bio               interface{} `json:"bio"`
    Blog              string      `json:"blog"`
    Company           string      `json:"company"`
    CreatedAt         string      `json:"created_at"`
    Email             string      `json:"email"`
    EventsURL         string      `json:"events_url"`
    Followers         float64     `json:"followers"`
    FollowersURL      string      `json:"followers_url"`
    Following         float64     `json:"following"`
    FollowingURL      string      `json:"following_url"`
    GistsURL          string      `json:"gists_url"`
    GravatarID        string      `json:"gravatar_id"`
    Hireable          bool        `json:"hireable"`
    HtmlURL           string      `json:"html_url"`
    ID                float64     `json:"id"`
    Location          string      `json:"location"`
    Login             string      `json:"login"`
    Name              string      `json:"name"`
    OrganizationsURL  string      `json:"organizations_url"`
    PublicGists       float64     `json:"public_gists"`
    PublicRepos       float64     `json:"public_repos"`
    ReceivedEventsURL string      `json:"received_events_url"`
    ReposURL          string      `json:"repos_url"`
    SiteAdmin         bool        `json:"site_admin"`
    StarredURL        string      `json:"starred_url"`
    SubscriptionsURL  string      `json:"subscriptions_url"`
    Type              string      `json:"type"`
    UpdatedAt         string      `json:"updated_at"`
    URL               string      `json:"url"`
}