golangの日記

Go言語を中心にプログラミングについてのブログ

Go言語(golang)の構造体とJSON

goalng


構造体のタグを使ってJSONのフィールド名/オプションを指定する
jsonのパースなど詳しい使い方は Go言語 JSON Marshal, Unmarshal, NewDecoder, NewEncoder の使い方 に書きましたのでそちらをどうぞ。




目次



構造体のタグの指定方法


構造体にJSONのタグを指定する

以下のようにカンマ区切りでフィールド名とオプションを指定する

type User struct {
    Name string `json:"[JSONのフィールド名],[オプション]"`
}


オプションの種類

オプションとして指定可能な値

  • omitempty
    構造体の値が初期値だった場合は、JSONに出力されない
    初期値とは string型なら空文字、int型なら 0 など

  • string
    JSONに変換する場合は 文字列型 とし、
    JSONから構造体などにマッピングするときは、指定した型にする

  • -
    構造体の値がなんであろうと、JSONとして出力しない
    - をJSONのフィールド名にしたい場合は json:"-," とする


タグの使い方と説明


type PhoneticCode struct {
    // 構造体のフィールド名の先頭が小文字の場合は、
    // Marshal, Unmarshal ともに無視される
    alpha string

    // タグを指定しない場合は、
    // 構造体のフィールド名 "Bravo" がそのまま使われ
    // "bravo" のように先頭が小文字でもよい
    Bravo string

    // 上に同じ
    // タグのフィールド名が空の場合は、
    // 構造体のフィールド名が使われる
    // この場合は "Charlie" になる
    Charlie string `json:""`

    // 上に同じ
    Delta string `json:","`

    // タグのフィールド名 ("echo") でJSONに変換される
    // JSONから構造体にマッピングする場合は、先頭が大文字 "Echo" でも良い
    Echo string `json:"echo"`

    // string型なので、値が空文字だった場合は変換されない
    Foxtrot string `json:"foxtrot,omitempty"`

    // JSONに変換した場合は string型 として変換される
    // 構造体にマッピングする場合は int型 になる
    Golf int `json:"golf,string"`

    // JSON、構造体 のどちらへ変換しても無視される
    Hotel string `json:"-"`

    // JSONのフィールド名を "-" にする
    // `json:"-"` のエスケープ
    India string `json:"-,"`

    // JSONにフィールド名がない場合は nil のまま
    Juliet *string `json:"juliet"`

    // 以下どちらでも、JSONに変換した場合は ナノ秒 からの桁になる
    Kilo time.Duration `json:"kilo,string"`
    Lima time.Duration `json:"lima"`
}