Rubyと筋肉とギターとわたし

筋トレが仕事です

【Golang】jsonをstructに変換したい

f:id:rdwbocungelt5:20200720165613p:plain

どうもてぃ。

絶賛golangをキャッチアップ中です。

APIとしてgolangを使用し、フロントエンドはnextjs/typescriptで自分で実装していく可能性があるのでどんどんアウトプットしていきます。

環境

やりたいこと

題の通り。

色んなサービスのAPIを触る際、受取側(golang)でstructを作ってやりたいが毎回作るのはめんどうくさい(ものによってはレスポンスめっちゃ多いのあるし)。

例えば、有名な決済サービスサイトstripeを例にしてみる。

stripe.com

{
  "id": "txn_1032HU2eZvKYlo2CEPtcnUvl",
  "object": "balance_transaction",
  "amount": 400,
  "available_on": 1386374400,
  "created": 1385814763,
  "currency": "usd",
  "description": "Charge for test@example.com",
  "exchange_rate": null,
  "fee": 42,
  "fee_details": [
    {
      "amount": 42,
      "application": null,
      "currency": "usd",
      "description": "Stripe processing fees",
      "type": "stripe_fee"
    }
  ],
  "net": 358,
  "reporting_category": "charge",
  "source": "ch_1032HU2eZvKYlo2C0FuZb3X7",
  "status": "available",
  "type": "charge"
}

The balance transaction objectのレスポンスはこんな感じで、まあまあ長いし同じように他のレスポンスのstructを作るとなると結構面倒くさい。

JSON-to-Goを使う

すばらしいサービスです。

jsonをstructに変換してくれます。

mholt.github.io

上のjsonを入れると

ttype AutoGenerated struct {
    ID           string      `json:"id"`
    Object       string      `json:"object"`
    Amount       int         `json:"amount"`
    AvailableOn  int         `json:"available_on"`
    Created      int         `json:"created"`
    Currency     string      `json:"currency"`
    Description  string      `json:"description"`
    ExchangeRate interface{} `json:"exchange_rate"`
    Fee          int         `json:"fee"`
    FeeDetails   []struct {
        Amount      int         `json:"amount"`
        Application interface{} `json:"application"`
        Currency    string      `json:"currency"`
        Description string      `json:"description"`
        Type        string      `json:"type"`
    } `json:"fee_details"`
    Net               int    `json:"net"`
    ReportingCategory string `json:"reporting_category"`
    Source            string `json:"source"`
    Status            string `json:"status"`
    Type              string `json:"type"`
}

こんな感じでstructに変換してくれます。

structの名前はデフォルトでAutoGeneratedになるので適宜変えるといい感じに出来ますね。

整理すると

type BalanceTransactionObject struct {
    ID           string      `json:"id"`
    Object       string      `json:"object"`
    Amount       int         `json:"amount"`
    AvailableOn  int         `json:"available_on"`
    Created      int         `json:"created"`
    Currency     string      `json:"currency"`
    Description  string      `json:"description"`
    ExchangeRate interface{} `json:"exchange_rate"`
    Fee          int         `json:"fee"`
    FeeDetails   []FeeDetails`json:"fee_details"`
    Net               int    `json:"net"`
    ReportingCategory string `json:"reporting_category"`
    Source            string `json:"source"`
    Status            string `json:"status"`
    Type              string `json:"type"`
}

type FeeDetails struct {
    Amount      int         `json:"amount"`
    Application interface{} `json:"application"`
    Currency    string      `json:"currency"`
    Description string      `json:"description"`
    Type        string      `json:"type"`
}

素晴らしすぎる。

おわり

記事書いたあとに気づいたんですが、JSON-to-GoのInline type Definitionsのチェックボックを外すと整理したstructと同じものを作成できますね。。。

まあ、そういう日もあるか。

備忘録的な感じなので、結構有名なサービスで他にも良いのあったらぜひぜひコメントお願いします。