Go言語と構造体とJSONと秘密情報

Goでアプリを作成している時に構造体を書いて、タグをつけて、JSONで クライアントに返して...とやりますが、その際にパスワードのような クライアントに返したくないけど、受け取るのは必要というデータの 取り扱いについてとりあえず自分の中で腑に落ちたやり方。

こういう構造体を

type User struct {
	Name     string `json:"name"`
	Email    string `json:"email"`
	Password string `json:"-"`
}

こうします。

type User struct {
	Name     string `json:"name"`
	Email    string `json:"email"`
	Password string `json:"-"`
}

type Secret struct {
    Password string `json:"password"`
}

で、クライアントに返すときはUser構造体をjson.Marshalしたものを返して、 受け取るときは少しだけ面倒ですが、UserSecretにそれぞれ json.Unmarshalをしてやると、うまいこと扱えます。

// クライアントに返すとき
u := new(User)
u.Name = "Tarou Yamada"
u.Email = "tarou@hogehuga.corp"
u.Password = "passworddayo"
jsonString, _ := json.Marshal(u)

fmt.Println(string(jsonString)) // パスワードだけ出力されない


// クライアントから受け取るとき
jsonString = []byte(`{"name":"Tarou Yamada","email":"tarou@hogehuga.corp", "password":"passworddayo"}`)
u = new(User)
json.Unmarshal(jsonString, u)

fmt.Println("password: ", u.Password) // "" 空っぽ

s := new(Secret)
json.Unmarshal(jsonString, s)

fmt.Println("password: ", s.Password) // "passworddayo"  yeah!

動くやつ → The Go Playground