JSON 与 API
encoding/json、struct tag、Marshal/Unmarshal、json.RawMessage
JSON 与 API
Go 标准库 encoding/json 处理 JSON,配合 net/http 即可构建 REST API——零第三方依赖。
学完本章你将: 掌握 Marshal/Unmarshal、struct tag、json.RawMessage。
序列化与反序列化
go
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"name"` // struct tag 指定 JSON 字段名
Age int `json:"age"`
Email string `json:"email,omitempty"` // 为空时省略
Secret string `json:"-"` // 忽略此字段
}
func main() {
// 序列化
u := User{Name: "小明", Age: 25}
data, _ := json.Marshal(u)
fmt.Println(string(data))
// {"name":"小明","age":25}
// 反序列化
var u2 User
json.Unmarshal(data, &u2)
fmt.Println(u2.Name) // 小明
}
struct tag 常用选项
go
type Config struct {
Host string `json:"host"` // 重命名
Port int `json:"port,string"` // 数字格式化为字符串
Debug bool `json:"debug,omitempty"` // 零值时省略
Extra map[string]json.RawMessage `json:"-"` // 忽略
}
简单 HTTP API
go
func main() {
http.HandleFunc("/api/user", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
user := User{Name: "小明", Age: 25}
json.NewEncoder(w).Encode(user) // 流式写入——更高效
})
http.ListenAndServe(":8080", nil)
}