encoding/json
Golang 标准库 - encoding/json
encoding/json 包实现了 JSON 对象的编码和解码。RFC 7159 定义了 JSON 格式。
主要功能说明:
-
编码(序列化):
Marshal()将 Go 值编码为 JSONMarshalIndent()格式化编码Encoder流式编码
-
解码(反序列化):
Unmarshal()解码 JSON 到 Go 值Decoder流式解码RawMessage延迟解码
-
结构体标签:
json:"name"指定 JSON 字段名json:"-"忽略字段json:",omitempty"空值时省略
-
自定义编码:
- 实现
Marshaler接口 - 实现
Unmarshaler接口
- 实现
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Email string `json:"email,omitempty"`
Hobbies []string `json:"hobbies,omitempty"`
// 忽略此字段
Password string `json:"-"`
}
func main() {
// 1. 结构体编码为 JSON
fmt.Println("=== 编码 ===")
person := Person{
Name: "Alice",
Age: 30,
Hobbies: []string{"reading", "coding"},
Password: "secret",
}
// 标准编码
data, err := json.Marshal(person)
if err != nil {
log.Fatal(err)
}
fmt.Println("Marshal:", string(data))
// 格式化编码
prettyData, _ := json.MarshalIndent(person, "", " ")
fmt.Println("\nMarshalIndent:")
fmt.Println(string(prettyData))
// 2. JSON 解码为结构体
fmt.Println("\n=== 解码 ===")
jsonStr := `{"name":"Bob","age":25,"email":"bob@example.com"}`
var p Person
err = json.Unmarshal([]byte(jsonStr), &p)
if err != nil {
log.Fatal(err)
}
fmt.Printf("解码结果: %+v\n", p)
// 3. 动态类型处理
fmt.Println("\n=== 动态类型 ===")
var result map[string]interface{}
json.Unmarshal([]byte(jsonStr), &result)
fmt.Printf("map: %v\n", result)
fmt.Printf("name: %v\n", result["name"])
// 4. 流式编码
fmt.Println("\n=== 流式编码 ===")
encoder := json.NewEncoder(os.Stdout)
encoder.SetIndent("", " ")
encoder.Encode(person)
// 5. JSON 数组处理
fmt.Println("\n=== JSON 数组 ===")
jsonArray := `[{"name":"Alice","age":30},{"name":"Bob","age":25}]`
var people []Person
json.Unmarshal([]byte(jsonArray), &people)
fmt.Printf("数组: %+v\n", people)
}