Z
ZHANK
工程化

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)
}