encoding/json

Created
Sep 15, 2023 03:02 AM
Tags
标准库
这个包可以实现json的编码和解码,就是将json字符串转换为struct,或者将struct转换为json。

核心的两个函数

func Marshal(v interface{}) ([]byte, error)
将struct编码成json,可以接收任意类型
func Unmarshal(data []byte, v interface{}) error
将json转码为struct结构体

两个核心结构体

type Decoder struct { // contains filtered or unexported fields }
从输入流读取并解析json
type Encoder struct { // contains filtered or unexported fields }
结构体转换为json
package main import ( "encoding/json" "fmt" ) type Person struct { Name string Age int Email string } func main() { p := Person{ "lzc", 18, "hybpjx@163.com", } b, _ := json.Marshal(p) fmt.Printf("b:%v\n", string(b)) // {"Name":"lzc","Age":18,"Email":"hybpjx@163.com"} }
json转换为结构体
package main import ( "encoding/json" "fmt" ) type Person struct { Name string Age int Email string } func Unmarshal() { b1 := []byte(`{"Name":"lzc","Age":18,"Email":"hybpjx@163.com"}`) var m Person json.Unmarshal(b1, &m) fmt.Printf("m: %v\n", m) } func main() { Unmarshal() }
解析嵌套引用类型
package main import ( "encoding/json" "fmt" ) type Person struct { Name string Age int Email string Parent []string } func main() { p := Person{ Name: "tom", Age: 20, Email: "tom@gmail.com", Parent: []string{"big tom", "big kite"}, } b, _ := json.Marshal(p) fmt.Printf("b: %v\n", string(b)) // {"Name":"tom","Age":20,"Email":"tom@gmail.com","Parent":["big tom","big kite"]} }
io流Reader Writer可以扩展到http websocket等场景
package main import ( "encoding/json" "fmt" "os" ) func main() { f, _ := os.Open("a.json") defer f.Close() d := json.NewDecoder(f) var v map[string]interface{} d.Decode(&v) fmt.Printf("v:%v\n", v) }
写入文件
package main import ( "encoding/json" "os" ) func main() { type Person struct { Name string Age int Email string } p := Person{ "lzc", 18, "hybpjx@163.com", } f, _ := os.OpenFile("a.json", os.O_WRONLY, 0777) defer f.Close() e:=json.NewEncoder(f) e.Encode(p) }