ls -al

仮想通貨やプログラミングに関する事などをつらつらと書き綴ります

NEMAPIをGo言語で叩く(2)

以前こちらの記事でGo言語を用いてNEMのAPIを叩きましたが、
この時点では生のjsonを文字列として表示しただけでした。
今回はjsonをパースし、構造体に代入する部分までを行います。

ソースコード

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

type Heartbeat struct {
    Code    int    `json:"code"`
    Type    int    `json:"type"`
    Message string `json:"message"`
}

func main() {
    resp, err := http.Get("http://alice2.nem.ninja:7890/heartbeat")

    if err != nil {
        fmt.Println(err)
        return
    }

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println(err)
        return
    }

    var heartbeat Heartbeat

    if err := json.Unmarshal(body, &heartbeat); err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(heartbeat)
}

実行結果

{1 2 ok}

解説

encoding/jsonパッケージに含まれるjson.Unmarshal()を利用します。
これの第一引数にjsonを、第二引数にjsonを表現した構造体の変数のポインタを
渡すと、構造体の対応する変数内にデータが格納されます。
jsonを表現した構造体は、複雑になってくると手打ちで書くのが大変になるので
こちらで自動生成することをおすすめします。

余談ですが、このコードを制作している時に、構造体の変数は頭文字が大文字
だとpublic、小文字だとprivateという仕様に気が付かず、なぜか正しい値
が出てこないと30分ほど悩みました。まだまだ勉強あるのみですね。

参考

Qiita - Go言語でJSONに泣かないためのコーディングパターン
Qiita - Go言語でのJSONデータの扱い【備忘録】