说明:
golang中包含匿名字段的结构体在解析和序列化(json.Unmarshal和json.Marshal)的时候:
如果对匿名字段指定了解析说明`json:""`,就会变成带层级的字符数组。
如果没指定解析说明,则会平铺。
例子:
匿名字段不加解析说明`json""`,就是和平铺的字符串相互转化
和平铺的字符串互相转化成功:
package main
import (
"encoding/json"
"fmt"
)
func main() {
initStr := []byte(`{"father_str":"i am father","son_int":3,"son_str":"i am son"}`)
father := &Father{}
err := json.Unmarshal(initStr, father)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(father)
newStr, err := json.Marshal(father)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(newStr))
}
type Father struct {
Son
FatherStr string `json:"Father_str"`
}
type Son struct {
SonStr string `json:"son_str"`
SonStrInt int `json:"son_int"`
}
&{{i am son 3} i am father}
{"son_str":"i am son","son_int":3,"Father_str":"i am father"}
带层级的字符串转化失败
package main
import (
"encoding/json"
"fmt"
)
func main() {
//initStr := []byte(`{"father_str":"i am father","son_int":3,"son_str":"i am son"}`)
initStr := []byte(`{"son":{"son_int":3,"son_str":"i am son"},"father_str":"i am father"}`)
father := &Father{}
err := json.Unmarshal(initStr, father)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(father)
newStr, err := json.Marshal(father)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(newStr))
}
type Father struct {
Son
FatherStr string `json:"Father_str"`
}
type Son struct {
SonStr string `json:"son_str"`
SonStrInt int `json:"son_int"`
}
&{{ 0} i am father}
{"son_str":"","son_int":0,"Father_str":"i am father"}
二、匿名字段加解析说明`json""`,就必须和带层级的字符串相互转化
平铺的字符串转化失败
package main
import (
"encoding/json"
"fmt"
)
func main() {
initStr := []byte(`{"father_str":"i am father","son_int":3,"son_str":"i am son"}`)
father := &Father{}
err := json.Unmarshal(initStr, father)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(father)
newStr, err := json.Marshal(father)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(newStr))
}
type Father struct {
Son `json:"son"`
FatherStr string `json:"Father_str"`
}
type Son struct {
SonStr string `json:"son_str"`
SonStrInt int `json:"son_int"`
}
&{{ 0} i am father}
{"son":{"son_str":"","son_int":0},"Father_str":"i am father"}
和带层级的结构体互相转化成功
package main
import (
"encoding/json"
"fmt"
)
func main() {
initStr := []byte(`{"son":{"son_int":3,"son_str":"i am son"},"father_str":"i am father"}`)
father := &Father{}
err := json.Unmarshal(initStr, father)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(father)
newStr, err := json.Marshal(father)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(newStr))
}
type Father struct {
Son `json:"son"`
FatherStr string `json:"Father_str"`
}
type Son struct {
SonStr string `json:"son_str"`
SonStrInt int `json:"son_int"`
}
&{{i am son 3} i am father}
{"son":{"son_str":"i am son","son_int":3},"Father_str":"i am father"}