注意! この記事はQiitaにて公開されていた内容をimportしたものです。
これらの内容は場合によっては陳腐化していて役に立たなくなっていたり、有害であったり、現在の著者の主張と異なることがあります。
皆様の判断の上でご利用いただけますと幸いです(度を超してヤバいものは著者に連絡して頂ければ対応します m(_ _)m)


golangでjsonを扱う鯖を書いているときにタグ(アノテーションとも)で制御することは多いのだけど、 キー名いじる以外に何かできないか?と調べてみた。

ちなみにタグのフォーマット不正検出は go vet コマンドを使うみたい。 参考: Goのjson.Marshal/Unmarshalの仕様を整理してみる - I Will Survive

ソース元: json - The Go Programming Language#Marshal

Marshal(JSON Encode)時に別のキー名をつける

type Model struct {
    Field int `json:"field"`
}

デフォルトではフィールドの名前をそのまま使う。 よって(golangの流儀に則って普通に命名したら)CamelCaseになって、 それがクライアント側に行くと、ちょっと都合悪いことがある。 だから明示的にキー名をいじることは多いと思う。

Marshal時に出力しない

type Model struct {
    Field1 int `json:"-"`
    Field2 int `json:",omitempty"`
    Field3 int `json:"-,"`
}

Field1は、いかなる場合でもJSONとして出力されない。 Field2は、値が空1のときJSONとして出力されない。 Field3は、キー名が"-“として出力される(出力されない、というわけではないので注意!)

強制的にJSONエンコードstringで出力する

type Model struct {
    Field1 int64 `json:"field1"`
    Field2 int64 `json:"field2,string"`
}

Demo: http://play.golang.org/p/jYOJJqOrfE

Demoを見る限り、field1は型どおりJSON形式のNumberとして、field2はint64型であるにも関わらずJSON形式のStringで出力されていることが分かる。


  1. The “omitempty” option specifies that the field should be omitted from the encoding if the field has an empty value, defined as false, 0, a nil pointer, a nil interface value, and any empty array, slice, map, or string. (json - The Go Programming Language↩︎