golang json omitempty 标签研究

今天遇到一个奇怪的情况,我结构体的一个字段明明用了omitempty 标签,但是返回json的时候却还是显示了出来。

bash 复制代码
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标签,但是还是被打印出来了。

然后把

bash 复制代码
type Data struct {
	Aa string      `json:"aa"`
	Bb []BbDetails `json:"Bb"`
}

改为

bash 复制代码
type Data struct {
	Aa string      `json:"aa,omitempty"`
	Bb []BbDetails `json:"Bb,omitempty"`
}

就可以了

原因:

首先data无论是否有omitempty 标签都会显示,说明空结构体其实在序列化的时候并不会被认为是空值,所以不会被忽略。然后因为空结构体不会被忽略,所以结构体里面的字段不加omitempty的话肯定会显示。