让我来详细讲解一下 "golang struct json tag的使用以及深入讲解" 的攻略。
1. 什么是 struct json tag?
golang中,可以在一个 struct 中通过添加 json tag,来指定如何将 struct 转换为 JSON 格式(序列化)或将 JSON 数据转换为 struct(反序列化)。在 JSON Tag 中,一个字段的名称是必需的,然后,可以指定多个属性来定义 JSON 序列化的细节。
2. 如何使用 struct json tag?
我们通过举例说明来了解如何使用 struct tag。
2.1 示例一:将 struct 转化为 JSON 格式
下面的代码演示了如何使用 struct json tag 将 struct 转化为 JSON 格式:
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"userName"`
Age int `json:"age"`
Gender string `json:"gender,omitempty"`
}
func main() {
user := User{
Name: "Alice",
Age: 20,
}
jsonStr, err := json.Marshal(user)
if err != nil {
fmt.Println("Failed to marshaling, err:", err)
return
}
fmt.Println(string(jsonStr))
}
输出结果为:
{"userName":"Alice","age":20}
可以看出,我们在每个字段后面通过 json:"<name>"
来指定该字段序列化后的 key 名称,如果不指定,则默认使用该字段的名称。
同时,我们还可以使用 omitempty
选项,来控制在该字段为空时是否序列化该字段。在上面的示例中,我们在 Gender 字段后面添加了 omitempty
,当 Gender 为空时,在序列化 json 时该字段会被忽略。
2.2 示例二:从 JSON 数据反序列化为 struct
下面的代码演示了如何使用 struct json tag 将 JSON 数据反序列化为 struct:
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"userName"`
Age int `json:"age"`
Gender string `json:"gender,omitempty"`
}
func main() {
jsonStr := `{"userName":"Bob", "age":30}`
var user User
err := json.Unmarshal([]byte(jsonStr), &user)
if err != nil {
fmt.Println("Failed to unmarshaling, err:", err)
return
}
fmt.Printf("Name:%s, Age:%d, Gender:%s\n", user.Name, user.Age, user.Gender)
}
输出结果为:
Name:Bob, Age:30, Gender:
可以看出,我们同样通过 struct json tag 的方式,在每个字段后面指定了 JSON 数据中对应的 key 名称,之后通过 json.Unmarshal 函数将 JSON 数据解析成了对应的 struct 对象。
3. struct tag 常用的属性介绍
json:"<name>"
:指定该字段序列化后对应的 key 名称;json:"-"
:不进行序列化,即该字段在序列化时会被忽略;json:",omitempty"
:当该字段为空时,在序列化 json 时该字段会被忽略;json:"<name>,string"
:将该字段序列化为字符串;json:"<name>,number"
:将该字段序列化为 JSON 数字;json:"<name>,string,omitempty"
:将该字段序列化为字符串,在该字段为空时在序列化时忽略该字段;json:"<name>,string,omitempty"
:将该字段序列化为 JSON 数字,在该字段为空时在序列化时忽略该字段。
注:还有其他更多的属性可以用来对 struct tag 进行明确的控制,可以在需要的时候查看官方文档。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:golang struct json tag的使用以及深入讲解 - Python技术站