🥺

GoのJSON扱いに慣れない全人類へ

2022/03/24に公開

ターゲット層

  • Goという言語に初めて触れる人及び初級者
  • JS上がりでJSライクにかけるからという理由でGoに手を出した人
  • 備忘録的に書きます

GoにおけるJSONの扱いについて

そもそもGoでは任意でJsonを扱うことはできません。(データを抽出できないの意)

MarshalとUnmarshalの違いをしっかり解ろう

標準ライブラリであるencoding/jsonを用いると強力な武器であるMarshal、Unmarshalが手に入ります。

Marshalは何に使われるか

エンコーディングはインメモリ表現からバイト列表現への変換のことを指します。

※エンコーディングをここではマーシャルと置き換える。

まあつまりはGo構造体からJSONを作ることができます。

type User struct {
  Id int
  Name string `json:"name"`
  Password string `json:"password"`
}

Tarou, err := json.Marshal(User{
  Id: 1
  Name: "Tarou"
  Password: "tatata1111"
})

このコーディングでJSONを作成することができます。

しかし、JSONを作れたからといってこのデータをGoで扱えるというわけではありません。
この状態でfmt.Println(Tarou)などとすると意味のわからない数字の羅列が帰ってきてしまいます。(実際この数字の羅列はメモリのポインタを表す。)

そこで現れるのが以下

Unmarshal

デコーディングはバイト列表現からインメモリ表現への変換のことを指します。

この意味のわからない数字の羅列を決まった形に変えてくれます。
戻す(デコーディング)際にもGo構造体は必要になるので再利用できます。

type User struct {
  Id int
  Name string `json:"name"`
  Password string `json:"password"`
}

Tarou, err := json.Marshal(User{
  Id: 1
  Name: "Tarou"
  Password: "tatata1111"
})

var u User
if err := json.Unmarshal([]byte(u), &u); err != nil {
  fmt.Println(err)
}

Name := u.Name
Password := u.Password

と言ったように求めることが可能です。
ここでは詳しいコードの解説はしませんが、Unmarshalは第一引数に指定したJSONを第二引数で指定したポインタへ保存してくれます。

それによって今回ではuという変数にJSONのデータが入ってきます。
とは言え詳しいことはわからないので有識者の方ご教授いただけると幸いです

結論

なんだかんだ書いたけど、やっぱりGo書いてて楽し〜〜〜〜

参考文献

https://zenn.dev/hsaki/articles/go-convert-json-struct
https://post-output.com/go-marshal-unmarshal/

自己紹介

https://github.com/ryuji-cre8ive
https://twitter.com/ryuji_vlog

Discussion