golang标准库有一个名叫encoding/json
的包,包含了JSON的序列化(Marshal)和反序列化(Unmarshal)的能力。
通过成员标签控制JSON输出
type Movie struct {
Title string
Year int `json:"released"`
Color bool `json:"color,omitempty"`
Actors []string
}
成员标签是一组有空格分开的键值对,格式为key:"value"
。键json
对应的值是输出JSON的文字或其它选项,omitempty
的意思是,当这个成员是零值或空值时不输出。
JSON序列化
var movies = []Movie{
{
Title: "Casablanca", Year: 1942, Color: false,
Actors: []string{"Humphrey Bogart", "Ingrid Bergman"},
},
{
Title: "Cool Hand Luke", Year: 1967, Color: true,
Actors: []string{"Paul Newman"},
},
{
Title: "Bullitt", Year: 1968, Color: true,
Actors: []string{"Steve McQueen", "Jacqueline Bisset"},
},
}
// if data, err := json.Marshal(movies); err == nil {
data, err := json.MarshalIndent(movies, "", " ")
if err == nil {
jsonStr := string(data)
fmt.Println(jsonStr)
} else {
fmt.Println(err)
}
json.Marshal
输出的结果是很紧凑的json,可以使用json.MarshalIndent
进行格式化。
JSON反序列化
var moviesBack []Movie
if err := json.Unmarshal(data, &moviesBack); err != nil {
fmt.Println(err)
} else {
for _, movie := range moviesBack {
fmt.Println(movie.Title)
}
}
json.Unmarshal
的第二个参数,是一个对应类型变量的指针。