グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



GoのMarshal/Unmarshalの基本的な使い方とプライベートフィールドを持つ構造体での利用方法

アーティスではGoを使ったプロダクトの開発を進めています。
筆者も今年Goを始めたばかりの新参物です。
Goの文法はシンプルでわかりやすいのですが、開発を進めていくなかでjsonパッケージのMarshal/Unmarshalの使い方で悩んだので記事にまとめておきます。

Package json

Marshalの基本

json.Marshalは構造体をjsonに変換します。

  • json.Marshal
    •  func Marshal(v interface{}) ([]byte, error) 

基本的なサンプル

実行結果

構造体をjson文字列に変換できました。

構造体タグjsonについて

Marshalする際に構造体タグを利用することでMarshalの結果を一部制御できます

  •  json:”×××” 」で指定します
  •  json:”name” 」Marshalした時にjsonのキーを「name」にします
  •  json:”-“ 」Marshal時に省略する
  •  json:”omitempty” 」ゼロ値の時に省略

サンプル

実行結果

Unmarshalの基本

json.Unmarshalはjsonを構造体に変換します。

基本的なサンプル

実行結果

jsonから構造体に変換できました。

プライベートなフィールドを持つ構造体について

上記の例ではフィールドはすべてpublicでした。
しかし、実際にプロダクトを開発していく場合に構造体のフィールドを すべてpublicにすることはあまりないかと思います。
ただ、フィールドをprivateにした場合にMarshalを行うと返り値が空になってしまいます。
ここで悩んだのですが、MarshalJSONメソッドを定義することで解決できました。

Marshal時に空が返る例

実行結果

MarshalJSONメソッドで一時的な構造体を定義し、値を移し替えてMarshalを行う例

実行結果

またUnmarshalの時も構造体のフィールドがprivateだと値が入らずゼロ値になってしまいます。
この場合もUnmarshalJSONメソッドを定義して対処します。

Unmarshal時に値が入らない例

実行結果

UnmarshalJSONメソッドで一時的な構造体を定義し、Unmarshalを行ってから値を詰め直す例

実行結果

まとめ

今回は基本的なMarshal/Unmarshalの方法を確認しました。
実際の開発ではもっと複雑なデータに対して処理を行うケースもあります。
次回は構造体を埋め込んだ場合のMarshal/Unmarshalなども紹介できればと思います。

The following two tabs change content below.

竹内 和也

事業開発部 web application engineer
大学卒業後、Web系ベンチャー企業でシステムエンジニアを経て、2009年にアーティスへ入社。 システムエンジニアとして多くの大学・病院・企業・自社のwebシステム開発に携わる。 2020年より事業開発部として新規サービスの開発に従事している。 資格:LPIC3
この記事のカテゴリ

FOLLOW US

最新の情報をお届けします