这个包可以实现 json 的编码和解码,将 json 字符串转为 struct ,或者将 struct 转为 json
核心的两个函数
将 struct 转为 json ,接收任意类型
func Marshal(v interface{}) ([]byte, error)
将 json 转成 struct
func Unmarshal(data []byte, v interface{]) error
两个核心结构体
从输入流读取并解析 json
type Decoder struct {
// contains filtered or unexported fields
}
写 json 到输出流
type Encoder struct {
}
实例演示
结构体转json
type Person struct {
Name string
Age int
Email string
}
func Marshal() {
p := Person{
Name: "tom",
Age: 20,
Email: "tom@gmail.com",
}
b, _ := json.Marshal(p)
fmt.Printf("string(b): %v\n", string(b)) // string(b): {"Name":"tom","Age":20,"Email":"tom@gmail.com"}
}
json转结构体
多行字符串使用模板字符串
func Unmarshal() {
b1 := []byte(`{"Name":"tom","Age":20,"Email":"tom@gmail.com"}`)
var p Person
json.Unmarshal(b1, &p)
fmt.Printf("p: %v\n", p) // p: {tom 20 tom@gmail.com}
}
解析嵌套类型
Praents 转成切片类型
func test3() {
b := []byte(`{"Name":"tom","Age":20,"Email":"tom@gmail.com","Parents":["big tom","kite"]}`)
var f map[string]interface{}
json.Unmarshal(b, &f)
// f: map[Age:20 <Email:tom@gmail.com> Name:tom Parents:[big tom kite]]
fmt.Printf("f: %v\n", f)
for k, v := range f {
fmt.Printf("k: %v\n", k)
fmt.Printf("v: %v\n", v)
}
}
解析嵌套引用类型
func test4() {
type Person struct {go
Name string
Age int
Email string
Parent []string
}
p := Person{
Name: "tom",
Age: 18,
Email: "tom@gmail.com",
Parent: []string{"big tom", "big kite"},
}
b, _ := json.Marshal(p)
fmt.Printf("b: %v\n", b)
// string(b): {"Name":"tom","Age":18,"Email":"tom@gmail.com","Parent":["big tom","big kite"]}
fmt.Printf("string(b): %v\n", string(b))
}
io流Reader Writer扩展到http websocket等场景
{
"Name":"tom",
"Age":20,
"Email": "tom@gmail.com",
"Parents":[
"big tom",
"kite"
]
}
读取 json 文件
func test5() {
f, _ := os.Open("a.json")
defer f.Close()
dec := json.NewDecoder(f)
// enc := json.NewEncoder(os.Stdout)
var v map[string]interface{}
dec.Decode(&v)
// v: map[Age:20 <Email:tom@gmail.com> Name:tom Parents:[big tom kite]]
fmt.Printf("v: %v\n", v)
}
将结构体转成 json 写入 json 文件
func test6() {
type Person struct {
Name string
Age int
Email string
Parent []string
}
p := Person{
Name: "tom",
Age: 18,
Email: "tom@gmail.com",
Parent: []string{"big tom", "big kite"},
}
f, err := os.OpenFile("b.json", os.O_WRONLY|os.O_CREATE, 0777)
if err != nil {
fmt.Printf("err: %v\n", err)
}
e := json.NewEncoder(f)
e.Encode(p)
}
b.json
{"Name":"tom","Age":18,"Email":"tom@gmail.com","Parent":["big tom","big kite"]}