🎃

[Go]構造体のフィールドタグに"omitempty"があってもなくてもjson.Unmarshalには関係ない

2022/10/14に公開約600字

結論

omitemptyオプションが働くのはMarshalのときなので、Unmarshalの結果には影響しません。

https://pkg.go.dev/encoding/json#Marshal

https://pkg.go.dev/encoding/json#Unmarshal

調べてみた

実際のコードはこちらのplaygroundをご覧ください。

https://go.dev/play/p/x21CKJ8Rqp3

すべての要素がnullのjsonと、そもそも要素を全く持たないjsonとでUnmarshalを実行してみました。要素のパターンは以下のとおりです。

  1. 実体
  2. 実体 + omitempty
  3. ポインタ
  4. ポインタ + omitempty

omitemptyの有無に影響されることなく、実体であれば初期値である""になるし、ポインタであればnilになるという結果でした。

公式のドキュメントを再掲します。

https://pkg.go.dev/encoding/json#Marshal

https://pkg.go.dev/encoding/json#Unmarshal

omitemptyについて触れられているのはMarshalの説明のみで、Unmarshalの説明にはomitemptyについての記載がなく、考慮されていないことがわかりました。

別途、Marshalの挙動についても調べてみようと思います。

ではまた!

Discussion

ログインするとコメントできます