GO: 结构体字段后面的 `json` 标注
在 Go 语言中,在 Go 语言中,结构体字段后面的 json
标注是用来 指定字段在 JSON 数据中的名称 和 处理方式。这个标注告诉 Go 的 encoding/json
包在序列化(将结构体转换为 JSON)和反序列化(将 JSON 转换为结构体)时,如何映射结构体的字段与 JSON 数据中的键。
JSON 标注的基本语法:
type Example struct {
Field1 string `json:"field1_name"`
Field2 int `json:"field2_name"`
}
标注格式解释:
json:"field1_name"
:告诉encoding/json
包,在 JSON 中使用field1_name
来表示结构体中的Field1
字段。- 标注中的字符串部分可以包含多种指令,用来控制 JSON 的处理方式。
常见的 JSON 标注选项:
-
字段名称映射:
- 你可以指定一个结构体字段在 JSON 中的名称。
- 例如:
json:"username"
说明结构体字段的名称是username
,而不是UserName
。
type User struct { Name string `json:"username"` Age int `json:"age"` }
-
忽略某个字段:
- 使用
json:"-"
来告诉json
包忽略该字段(即在序列化和反序列化时不处理该字段)。
type User struct { Name string `json:"username"` Password string `json:"-"` }
在这个例子中,
Password
字段会被忽略,不会出现在 JSON 中。 - 使用
-
字段的零值处理:
- 如果一个字段的值为零值(例如
""
、0
、false
等),可以通过使用omitempty
标志来使得该字段在 JSON 输出时被忽略。
type User struct { Name string `json:"username,omitempty"` Age int `json:"age,omitempty"` }
如果
Name
或Age
字段是零值(如空字符串或 0),它们就不会出现在最终的 JSON 输出中。 - 如果一个字段的值为零值(例如
-
结构体的嵌套:
- 如果结构体是嵌套的,
json
标注会自动应用到嵌套的字段。
type Address struct { Street string `json:"street"` City string `json:"city"` } type User struct { Name string `json:"username"` Address Address `json:"address"` }
在这种情况下,嵌套结构体
Address
会被序列化成address
字段,而Address
结构体内的字段会被序列化为其对应的 JSON 键(例如,Street
和City
)。 - 如果结构体是嵌套的,
示例:
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"username"`
Age int `json:"age,omitempty"`
Password string `json:"-"`
}
func main() {
user := User{
Name: "Alice",
Age: 0, // 这里是零值
Password: "secret",
}
// 将结构体转换为 JSON
jsonData, _ := json.Marshal(user)
fmt.Println(string(jsonData)) // 输出: {"username":"Alice"}
}
输出结果:
{"username":"Alice"}
在这个例子中,Age
字段因为是零值(0)被 omitempty
忽略,而 Password
字段因为使用了 json:"-"
被完全忽略,不出现在 JSON 输出中。
总结:
json
标注帮助我们控制结构体字段与 JSON 数据之间的映射。- 可以指定字段名、忽略字段、忽略零值字段。
- 在序列化和反序列化过程中,
json
标注提供了灵活的字段控制。是用来 指定字段在 JSON 数据中的名称 和 处理方式。这个标注告诉 Go 的encoding/json
包在序列化(将结构体转换为 JSON)和反序列化(将 JSON 转换为结构体)时,如何映射结构体的字段与 JSON 数据中的键。
JSON 标注的基本语法:
type Example struct {
Field1 string `json:"field1_name"`
Field2 int `json:"field2_name"`
}
标注格式解释:
json:"field1_name"
:告诉encoding/json
包,在 JSON 中使用field1_name
来表示结构体中的Field1
字段。- 标注中的字符串部分可以包含多种指令,用来控制 JSON 的处理方式。
常见的 JSON 标注选项:
-
字段名称映射:
- 你可以指定一个结构体字段在 JSON 中的名称。
- 例如:
json:"username"
说明结构体字段的名称是username
,而不是UserName
。
type User struct { Name string `json:"username"` Age int `json:"age"` }
-
忽略某个字段:
- 使用
json:"-"
来告诉json
包忽略该字段(即在序列化和反序列化时不处理该字段)。
type User struct { Name string `json:"username"` Password string `json:"-"` }
在这个例子中,
Password
字段会被忽略,不会出现在 JSON 中。 - 使用
-
字段的零值处理:
- 如果一个字段的值为零值(例如
""
、0
、false
等),可以通过使用omitempty
标志来使得该字段在 JSON 输出时被忽略。
type User struct { Name string `json:"username,omitempty"` Age int `json:"age,omitempty"` }
如果
Name
或Age
字段是零值(如空字符串或 0),它们就不会出现在最终的 JSON 输出中。 - 如果一个字段的值为零值(例如
-
结构体的嵌套:
- 如果结构体是嵌套的,
json
标注会自动应用到嵌套的字段。
type Address struct { Street string `json:"street"` City string `json:"city"` } type User struct { Name string `json:"username"` Address Address `json:"address"` }
在这种情况下,嵌套结构体
Address
会被序列化成address
字段,而Address
结构体内的字段会被序列化为其对应的 JSON 键(例如,Street
和City
)。 - 如果结构体是嵌套的,
示例:
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"username"`
Age int `json:"age,omitempty"`
Password string `json:"-"`
}
func main() {
user := User{
Name: "Alice",
Age: 0, // 这里是零值
Password: "secret",
}
// 将结构体转换为 JSON
jsonData, _ := json.Marshal(user)
fmt.Println(string(jsonData)) // 输出: {"username":"Alice"}
}
输出结果:
{"username":"Alice"}
在这个例子中,Age
字段因为是零值(0)被 omitempty
忽略,而 Password
字段因为使用了 json:"-"
被完全忽略,不出现在 JSON 输出中。
总结:
json
标注帮助我们控制结构体字段与 JSON 数据之间的映射。