我们可以使用 json.Marshal() 将结构体转换为 json。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type Role struct {
ID int `json:"id"`
Name string `json:"Name"`
}

type User struct {
ID int `json:"id"`
Username string `json:"username"`
Role *Role `json:"role"`
}

user := &User{
ID: 1,
Username: "user1",
}

b, err := json.Marshal(user)
if err != nil {
panic(err)
}

fmt.Println(string(b)) // 输出:{"id":1,"username":"user1","role":null}

json.Marshal() 会将 nil 转换为 null,所以 role 字段的值为 null

如果我们不想让值为 null 的字段出现在 json 中,可以使用 omitempty 标签,例如:

1
2
3
4
5
6
7
type User struct {
Id int `json:"id"`
Username string `json:"username"`
Role *Role `json:"role,omitempty"`
}

fmt.Println(string(b)) // 输出:{"id":1,"username":"user1"}

加了 omitempty 标签后,role 字段就被忽略了,不会出现在 json 中。实际上加了 omitempty 标签后,会忽略所有零值,不仅仅是空指针。

如果没有生效,看一下你是不是写成了 json:"role, omitempty"