# 5.11、Golang标准库-json 对json编码和解码 ## 两个核心函数 ```go // struct 转 json func Marshal(v any) ([]byte, error) {} // json 转 struct func Unmarshal(data []byte, v any) error {} ``` 示例 ```go package main import ( "encoding/json" "fmt" ) type Person struct { Name string Age int Email string } func main() { person := Person{ Name: "Tom", Age: 23, Email: "123@qq.com", } // 序列化 b, _ := json.Marshal(person) fmt.Printf("b: %v\n", string(b)) // b: {"Name":"Tom","Age":23,"Email":"123@qq.com"} // 反序列化 str := `{"Name":"Tom","Age":23,"Email":"123@qq.com"}` var p Person json.Unmarshal([]byte(str), &p) fmt.Printf("p: %v\n", p) // p: {Tom 23 123@qq.com} } ``` 解析嵌套类型 ```go package main import ( "encoding/json" "fmt" ) type Person struct { Name string Age int Pets []string } func main() { person := Person{ Name: "Tom", Age: 23, Pets: []string{"dog", "cat"}, } // 序列化 b, _ := json.Marshal(person) fmt.Printf("b: %v\n", string(b)) // b: {"Name":"Tom","Age":23,"Pets":["dog","cat"]} // 反序列化 str := `{"Name":"Tom","Age":23,"Pets":["dog","cat"]}` var p Person json.Unmarshal([]byte(str), &p) fmt.Printf("p: %v\n", p) // p: {Tom 23 [dog cat]} } ``` ## 两个核心结构体 ```go // io流 Reader type Decoder struct {} // io流 Writer type Encoder struct {} ``` 从文件中读取 person.json ```json { "Name": "Tom", "Age": 23, "Pets": ["dog", "cat"] } ``` ```go package main import ( "encoding/json" "fmt" "os" ) func main() { // 从文件中读取 f, _ := os.Open("person.json") defer f.Close() decoder := json.NewDecoder(f) var m map[string]interface{} decoder.Decode(&m) fmt.Printf("m: %v\n", m) // m: map[Age:23 Name:Tom Pets:[dog cat]] } ``` 写入文件 ```go package main import ( "encoding/json" "os" ) type Person struct { Name string Age int Pets []string } func main() { person := Person{ Name: "Tom", Age: 23, Pets: []string{"dog", "cat"}, } // 写入文件 f, _ := os.OpenFile("person.json", os.O_WRONLY|os.O_CREATE, 0777) defer f.Close() encoder := json.NewEncoder(f) encoder.Encode(person) } ``` 输出结果 person.json ```json {"Name":"Tom","Age":23,"Pets":["dog","cat"]} ```