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)
}