json包可以实现json的编码和解码,就是将json字符串转换为struct,或者将struct转换为json。
func Marshal(v any) ([]byte, error)
将struct编码成json,可以接收任意类型
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string
Age int
Email string
}
func main() {
p := Person{
Name: "zhangsan",
Age: 20,
Email: "zhangsan@mail.com",
}
b, _ := json.Marshal(p)
fmt.Printf("b: %v\n", string(b))
}
func Unmarshal(data []byte, v any) error
将json转码为struct结构体
这个函数会把传入的 data 作为一个JSON来进行解析,解析后的数据存储在参数 v 中。这个参数 v 也是任意类型的参数(但一定是一个类型的指针),原因是我们在是以此函数进行JSON 解析的时候,这个函数不知道这个传入参数的具体类型,所以它需要接收所有的类型。
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string
Age int
Email string
}
func main() {
b := []byte(`{"Name":"zhangsan","Age":20,"Email":"zhangsan@mail.com"}`)
var m Person
json.Unmarshal(b, &m)
fmt.Printf("m: %v\n", m)
}
type Decoder struct {
// contains filtered or unexported fields
}
从输入流读取并解析json,应用于io流Reader Writer可以扩展到http websocket等场景
package main
import (
"encoding/json"
"fmt"
"os"
)
func main() {
f, _ := os.Open("test.json")
defer f.Close()
d := json.NewDecoder(f)
var v map[string]interface{}
d.Decode(&v)
fmt.Printf("v: %v\n", v)
}
type Encoder struct {
// contains filtered or unexported fields
}
写json到输出流,应用于io流Reader Writer可以扩展到http websocket等场景
package main
import (
"encoding/json"
"os"
)
type Person struct {
Name string
Age int
Email string
Parent []string
}
func main() {
p := Person{
Name: "zhangsan",
Age: 20,
Email: "zhangsan@mail.com",
Parent: []string{"Daddy", "Mom"},
}
f, _ := os.OpenFile("test.json", os.O_WRONLY, 077)
defer f.Close()
d := json.NewEncoder(f)
d.Encode(p)
}