Goでjsonをエンコードするときのあれこれ

Goでjsonエンコードしたいときに、地味に迷ったのでその辺の話。

標準パッケージのencoding/jsonで簡単にできました。json.Marshal()で優勝できます。

ざっくり言うと、

脳死でやりたい→map[string]interface{}

きちんと型を使いたい→構造体+タグ

です。

 

map[string]interface{}

gist4a334e973f480360bccf0af277bea2be

こんな感じでmap[string]interface{}にjson.Marshalを使うと、何も考えずにjsonに変換できます。

$ go run map.go | python -m json.tool
{
    "age": 18,
    "height": 178.5,
    "name": "Yamada Tarou"
}

今回の話には関係ないんですけど、json.toolはjsonを整形して読みやすくしてくれます。Pythonさえ入っていれば使えるので、jsonを返すAPIcurlで叩くときとか地味に便利です。

 

構造体 + タグ

gist89cea221c91846b3f86e3708b77df09b

Goの構造体のフィールドには「タグ」と呼ばれる、メタ情報を付加させることができ、このメタ情報を使ってエンコードできます。

encoding/jsonは、与えられた構造体のフィールドのタグ内にjson:"[キー名]"という形式の文字列を見つけると、出力するJsonのキーとして利用します。

$ go run struct.go | python -m json.tool
{
    "age": 18,
    "height": 178.5,
    "name": "Yamada Tarou"
}

ちなみに、タグを指定せずに構造体を定義した場合は、フィールド名がキーとして利用されます。

 

デコードしたいとき

json.UnMarshal()を使えばOKです。