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