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を返すAPIをcurlで叩くときとか地味に便利です。
構造体 + タグ
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です。