Golang 第四章 5.json
Go 提供 encoding/json 包来处理 JSON 数据。
JSON 是 键值对表示的轻量级数据交换格式,广泛用于 Web API。
将结构体编码为 JSON
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string
Age int
}
func main() {
p := Person{Name: "Alice", Age: 30}
b, err := json.Marshal(p)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(b))
}输出:
{"Name":"Alice","Age":30}默认字段名与结构体字段相同
JSON 使用大写字段名才能导出(必须首字母大写)
使用结构体标签自定义 JSON 字段名
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}标签在反射时可用
编码后输出:
{"name":"Alice","age":30}忽略字段
type Person struct {
Name string `json:"name"`
Age int `json:"-"`
}- 表示编码时忽略该字段
JSON 解码为结构体
data := []byte(`{"name":"Alice","age":30}`)
var p Personerr := json.Unmarshal(data, &p)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(p.Name, p.Age) // Alice 30Unmarshal 需要传入 结构体指针
JSON 解码为 map
var m map[string]interface{}
json.Unmarshal(data, &m)
fmt.Println(m["name"]) // Alice值类型是 interface{}
适合未知 JSON 结构
切片和嵌套 JSON
type Person struct { Name string `json:"name"` Age int `json:"age"` Tags []string `json:"tags"`}data := []byte(`{"name":"Bob","age":25,"tags":["go","dev"]}`)var p Personjson.Unmarshal(data, &p)fmt.Println(p.Tags) // [go dev]支持数组、切片
支持嵌套结构体
小技巧
JSON key 必须首字母大写 或加标签
nil 切片 编码成 []
nil map 编码成 {}



评论