Goで構造体をJSONをエンコードする

GolangでAPIクライアント/サーバを作るときによく使うことになる、構造体からJSONにエンコードする方法をメモしておく。

encoding/json.Marshal()

基本的には標準ライブラリのencoding/json内に必要な関数が一式揃っているのでこちらを利用する。

type someJson struct {
	Name string
	ID   int
}

func main() {
	s := someJson{Name: "Alan Smithee", ID: 1}
	j, err := json.Marshal(s)
	if err != nil {
		fmt.Println("Error!")
		return
	}

	fmt.Printf("%v", string(j))
}

Golang Playgroundで実行した場合、出力は下記の通りになる。

{"Name":"Alan Smithee","ID":1}

構造体のフィールド変数はPublicにする必要がある

最初気付かなかったのだが(そして気付いてしまえば当然だよね、と言う気分になるのだが)、privateな変数はMarshallerがアクセス出来ないのでJSONにエンコードされない。

type someJsonWithPrivates struct {
	name string // プライベート変数なのでスキップされる
	ID   int
}
{"ID":1}

フィールド名を指定するとき

フィールド名は構造体の変数にタグを付けることで指定することができる。
タグの形式は`json:"field_name"`になる。

type someJsonWithAnnotation struct {
	FieldName string `json:"field_name"`
	FieldID   int    `json:field_id`
}
{"field_name":"Alan Smithee","field_id":1}