golang json omitempty 标签研究
今天遇到一个奇怪的情况,我结构体的一个字段明明用了omitempty 标签,但是返回json的时候却还是显示了出来。
type Result struct {Status string `json:"status"`Data Data `json:"data,omitempty"`
}
type Data struct {Aa string `json:"aa"`Bb []BbDetails `json:"Bb"`
}
type BbDetails struct {
}func main() {aa := []interface{}{}cc := Result{Status: "aa",}aa = append(aa, cc)jsonStr, _ := jsoniter.Marshal(aa)fmt.Println(string(jsonStr))
}
这里可以看到明明data没有赋值,同时也用了omitempty标签,但是还是被打印出来了。
然后把
type Data struct {Aa string `json:"aa"`Bb []BbDetails `json:"Bb"`
}
改为
type Data struct {Aa string `json:"aa,omitempty"`Bb []BbDetails `json:"Bb,omitempty"`
}
就可以了
原因:
首先data无论是否有omitempty 标签都会显示,说明空结构体其实在序列化的时候并不会被认为是空值,所以不会被忽略。然后因为空结构体不会被忽略,所以结构体里面的字段不加omitempty的话肯定会显示。