记录一些 golang json 序列化使用中的一些小技巧,直接上代码
1.忽略字段相关语法:
type People struct {
Name string `json:"name"` // specify "name" as "Name" when serialization
Age int `json:"aGe,omitempty"`//omit if age is empty when serialization
Gender string `json:"-"` // omit Gender when serialization
}
func main() {
var p People
p.Name = "John"
// p.Age = 30
p.Gender = "male"
data, err := json.Marshal(p)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(data))
}
// output:{"name":"John"}
2.关于嵌套
2.1 直接嵌套字段是并列的
type People struct {
Name string `json:"name"` // specify "name" as "Name" when serialization
Age int `json:"aGe,omitempty"`//omit if age is empty when serialization
Gender string `json:"-"` // omit Gender when serialization
Contact
}
type Contact struct {
Phone string `json:"phone"` //
Email string `json:"email"` //
}
func main(){
p:=People{
Name:"John",
Age:30,
Gender:"male",
Contact:Contact{
Phone:"123456",
Email:"abc@example.com",
},
}
b, err := json.Marshal(p)
if err!= nil {
fmt.Println(err)
}
fmt.Printf("%v\n",string(b))
}
// output:{"name":"John","aGe":30,"phone":"123456","email":"abc@example.com"}
2.2 别名嵌套
//...
Contact `json:"contact,omitempty"`
//...
//ouput:{"name":"John","aGe":30,"contact":{"phone":"123456","email":"abc@example.com"}}
2.3 在不修改原 struct 的情况下 忽略字段(嵌套指针的使用)
// eg: if I want to omit "Password" without modify "User",I can do follow operation:
type User struct {
Name string `json:"name"`
Password string `json:"password"`
}
type UserShell struct {
*User
Password *struct{} `json:"password,omitempty"`
}
func main(){
u:=User{
Name:"John",
Password:"johnpassword",
}
b, err := json.Marshal(UserShell{User: &u})
if err!= nil {
fmt.Println(err)
}
fmt.Printf("%v\n",string(b))
}
//output:{"name":"John"}