簡述
在使用Go Struct的Json Marshal的時候改含,通過Json To Go Struct工具可以生成結(jié)構(gòu)體,但是當(dāng)在結(jié)構(gòu)體中只對部分屬性賦值的時候民泵,Marshal后的字符串與預(yù)期不符癣丧,如下所示:
當(dāng)定義了Host中包含A、B栈妆、C三個結(jié)構(gòu)體時胁编,如果只為其中一個結(jié)構(gòu)賦值,我們期望Json中只包含這一個結(jié)構(gòu)體的值鳞尔。
func main() {
host := Host{
OA: A{
Content: "oa",
},
}
data, _ := json.Marshal(host)
fmt.Printf("data:%s", string(data))
}
// A
type A struct {
Content string `json:"content1"`
Text string `json:"content2"`
}
// B
type B struct {
Content string `json:"content3"`
}
// C RTX富文本內(nèi)容文本類型
type C struct {
Content string `json:"content4"`
}
// RichText RTX富文本內(nèi)容
type Host struct {
OA A `json:"text1"`
OB B `json:"text2"`
OC C `json:"text3"`
}
當(dāng)其他屬性為空時嬉橙,不要將該屬性加入Json串中,但是實際上會輸出寥假。
// 期望值
data:{"text1":{"content1":"oa"}}
// 實際值
data:{"text1":{"content1":"oa","content2":""},"text2":{"content3":""},"text3":{"content4":""}}
omitempty的作用
當(dāng)為所有結(jié)構(gòu)體(Host
市框、A
、B
糕韧、C
)中都加入了omitempty
標(biāo)記后枫振,運行后發(fā)生如下變化:
data:{"text1":{"content1":"oa"},"text2":{},"text3":{}}
omitempty
只能作用于string
或者int
等簡單類型的數(shù)據(jù),而無法作用于結(jié)構(gòu)體對象萤彩。
結(jié)構(gòu)體指針
當(dāng)遇見該種情況時粪滤,則需要使用結(jié)構(gòu)體指針即可解決
func main() {
host := Host{
// 將A的指針傳入
OA: &A{
Content: "oa",
},
}
data, _ := json.Marshal(host)
fmt.Printf("data:%s", string(data))
}
// A
type A struct {
Content string `json:"content1,omitempty"`
Text int `json:"content2,omitempty"`
}
// B
type B struct {
Content string `json:"content3,omitempty"`
}
// C RTX富文本內(nèi)容文本類型
type C struct {
Content string `json:"content4,omitempty"`
}
// RichText RTX富文本內(nèi)容
type Host struct {
// 復(fù)雜結(jié)構(gòu)體都使用指針定義,同時聲明omitempty即可
OA *A `json:"text1,omitempty"`
OB *B `json:"text2,omitempty"`
OC *C `json:"text3,omitempty"`
}
得到的輸出:
data:{"text1":{"content1":"oa"}}
參考資料
Go's "omitempty" explained
How to not marshal an empty struct into JSON with Go?