2023-02-20 02:04:14
在 Golang 中,处理 JSON 数据主要通过 encoding/json 包中的 json.Marshal 和 json.Unmarshal 实现,分别用于序列化(结构体转 JSON 字符串)和反序列化(JSON 字符串转结构体)。以下是具体用法和注意事项:

json.Marshal 用于将 Go 的结构体、切片、Map 等数据结构转换为 JSON 格式字符串。
基本用法示例:
type User struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email,omitempty"` // omitempty 表示空值不输出}func main() { user := User{ Name: "Alice", Age: 25, } data, _ := json.Marshal(user) fmt.Println(string(data)) // 输出: {"name":"Alice","age":25}}注意事项:

json.Unmarshal 用于将 JSON 字符串解析为 Go 结构体变量。
基本用法示例:
jsonStr := `{"name":"Bob","age":30,"email":"bob@example.com"}`var user Usererr := json.Unmarshal([]byte(jsonStr), &user) // 必须传入指针if err != nil { log.Fatal(err)}fmt.Printf("%+vn", user) // 输出: {Name:Bob Age:30 Email:bob@example.com}注意事项:
支持多层嵌套的结构体,直接映射 JSON 的嵌套对象。
示例:
type Address struct { City string `json:"city"` Zip string `json:"zip"`}type User struct { Name string `json:"name"` Address Address `json:"address"`}jsonStr := `{"name":"Charlie","address":{"city":"Shanghai","zip":"200000"}}`var user Userjson.Unmarshal([]byte(jsonStr), &user)使用 Map 处理动态结构当 JSON 结构不确定或动态变化时,可用 map[string]interface{} 解析。
示例:
var data map[string]interface{}jsonStr := `{"name":"Charlie","address":{"city":"Shanghai","zip":"200000"}}`json.Unmarshal([]byte(jsonStr), &data)fmt.Println(data["name"]) // 输出: Charliefmt.Println(data["address"]) // 输出: map[city:Shanghai zip:200000]适用场景:

掌握这些方法后,可覆盖大多数 JSON 处理场景,但需注意字段命名、嵌套结构和类型匹配的边界情况,建议通过单元测试验证。