【Golang】JSON Marshal & Unmarshal

json.Marshal(v interface{}) ([]byte, error)

    如果传入的v是一个 reference,则直接进行 marshal 如果传入的v是一个 pointer,则会将 pointer 中的内容解析,再进行marshal

json.Unmarshal(data []byte, v interface{}) error

    如果传入的v是一个 reference,则匹配相应的字段来进行 unmarshal 如果传入的v是一个 pointer,则会报错:json: Unmarshal(nil *srv.Animal) 因此如果期望用指针来 unmarshal data []byte,需要将指针指向某一空间,或者封装为结构体,并用结构体变量的指针当作 unmarshal 的入参 v,才能够正确解析 data 内容

Example

func main() {
          
   
	type Animal struct {
          
   
		Name string
	}
	type Human struct {
          
   
		Attr string
	}
	animal := Animal{
          
   Name: "xixi"}
	bs1, _ := json.Marshal(animal)
	fmt.Printf("
bs1: " + string(bs1))
	bs2, _ := json.Marshal(&animal)
	fmt.Printf("
bs2: " + string(bs2))
	var (
		resp1 Animal
		resp2 struct{
          
    *Animal }
		resp3 Human
		resp4 *Animal
		resp5 = &Animal{
          
   }
	)
	_ = json.Unmarshal(bs1, &resp1)
	_ = json.Unmarshal(bs1, &resp2)
	fmt.Printf("
resp1: %#v", resp1)
	fmt.Printf("
resp2: %#v", resp2.Animal)
	_ = json.Unmarshal(bs1, &resp3)
	fmt.Printf("
resp3: %#v", resp3)
	if err := json.Unmarshal(bs1, resp4); err != nil {
          
   
		fmt.Printf("
err: %s", err.Error())
	}
	_ = json.Unmarshal(bs1, resp5)
	fmt.Printf("
resp5: %#v", resp5)
}

// Output
// bs1: {"Name":"xixi"}
// bs2: {"Name":"xixi"}
// resp1: main.Animal{Name:"xixi"}
// resp2: &main.Animal{Name:"xixi"}
// resp3: main.Human{Attr:""}
// err: json: Unmarshal(nil *main.Animal)
// resp3: main.Human{Attr:""}
// resp5: &main.Animal{Name:"xixi"}
经验分享 程序员 微信小程序 职场和发展