【Golang】JSON Marshal & Unmarshal

本文探讨了在Golang中使用JSON Marshal和Unmarshal时,对于reference和pointer的区别。在marshal时,无论是reference还是pointer都会生效。而在unmarshal时,reference能匹配字段解析,但pointer需指向有效空间或结构体变量指针,否则会导致错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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("\nbs1: " + string(bs1))
	bs2, _ := json.Marshal(&animal)
	fmt.Printf("\nbs2: " + string(bs2))
	var (
		resp1 Animal
		resp2 struct{ *Animal }
		resp3 Human
		resp4 *Animal
		resp5 = &Animal{}
	)
	_ = json.Unmarshal(bs1, &resp1)
	_ = json.Unmarshal(bs1, &resp2)
	fmt.Printf("\nresp1: %#v", resp1)
	fmt.Printf("\nresp2: %#v", resp2.Animal)
	_ = json.Unmarshal(bs1, &resp3)
	fmt.Printf("\nresp3: %#v", resp3)
	if err := json.Unmarshal(bs1, resp4); err != nil {
		fmt.Printf("\nerr: %s", err.Error())
	}
	_ = json.Unmarshal(bs1, resp5)
	fmt.Printf("\nresp5: %#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"}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值