🥺
GoのJSON扱いに慣れない全人類へ
ターゲット層
- 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書いてて楽し〜〜〜〜
参考文献
自己紹介
Discussion