1章の表1で紹介したように,
encoding/ jsonパッケージ
JSONを扱うためにはencoding/Marshal()
と,Unmarshal()
が提供されています。
構造体からJSONへの変換
まずは次のような構造体を用意します。
type Person struct {
ID int
Name string
Email string
Age int
Address string
memo string
}
この構造体にデータを代入し,json.
に渡すだけで,[]byte
を生成できます。
func main() {
person := &Person{
ID: 1,
Name: "Gopher",
Email: "gopher@example.org",
Age: 5,
Address: "",
memo: "golang lover",
}
b, err := json.Marshal(person)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b)) // 文字列に変換
}
出力されたJSONは,
{
"ID": 1,
"Name": "Gopher",
"Email": "gopher@go.org",
"Age": 5,
"Address": ""
}
タグ付け
変換されたJSONを見てみると,
encoding/
`json:"name"` // nameというキーで格納する
`json:"-"` // JSONに格納しない
`json:",omitempty"` // 値が空なら無視
`json:",string"` // 値をJSONとして格納
タグは次のように,
type Person struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"-"`
Age int `json:"age"`
Address string `json:"address,omitempty"`
memo string
}
出力結果は次のように変わります。
fmt.Println(string(b))
// {"id":1,"name":"Gopher","age":5}
JSONから構造体への変換
逆にJSONの文字列からデータをマップした構造体を生成するには,json.
を使用します。格納するJSONと,
func main() {
var person Person
b := []byte(`{"id":1,"name":"Gopher","age":5}`)
err := json.Unmarshal(b, &person)
if err != nil {
log.Fatal(err)
}
fmt.Println(person) // {1 Gopher 5 }
}