go标准库之json模块

334 阅读1分钟

这个包可以实现 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"]}