Golang 中可以为 结构体 的字段添加 Tag,Golang 本身的 encoding/json 包解析 Json 使用了 Tag,一些开源的ORM 框架,也广泛使用了 Tag。
Golang 中定义结构体的 Tag,使用 ``,在解析 Json 时,可以通过 Tag 指定解析成 Json 字符串之后使用的字段名。
type User struct {
Name string `tag`
Passwd string `tag`
}
我们使用 `` 符号定义结构体的 tag。
将结构体转成 json 时,指定 tag
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
PName string `json:"Name"`
PAge int `json:"Age"`
}
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
//将结构体转成 json 时,指定 tag
jsonStr := `{"Name":"HaiCoder","Age":18}`
var p Person
if err := json.Unmarshal([]byte(jsonStr), &p); err != nil{
fmt.Println("Error =", err)
return
}
fmt.Println("Person =", p)
}
程序运行后,控制台输出如下:
我们定义了一个结构体 Person,该结构体定义有两个字段,一个是 string 类型的 PName,一个是 int 类型的 PAge。
同时,我们为结构体的字段 PName 设置了 Tag 为 json:"Name"
,为字段 PAge 设置 Tag 为 json:"Age"
。
因为,我们设置了 Tag,因此将 Json 串转成结构体时,会使用结构体中的 Tag 来匹配 Json 串中的 key,并将对应的字段解析到结构体中。
将 json 转成结构体
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
PName string `json:"Name"`
PAge int `json:"Age"`
}
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
//使用Go语言结构体 tag,将 json 转成结构体
person := &Person{
PName:"HaiCoder",
PAge :18,
}
if jsonStr, err := json.Marshal(person); err != nil{
fmt.Println("Err =", err)
}else{
fmt.Println("JsonStr =", string(jsonStr))
}
}
程序运行后,控制台输出如下:
我们定义了一个结构体 Person,并为结构体 Person 的字段 PName 设置 Tag 为 json:"Name"
, Person 的字段 PAge 设置 Tag 为 json:"Age"
。
因此,最后,我们将结构体转成 Json 串时,Json 串中的 key 是我们结构体中 Tag 指定的 key,而不是结构体的字段名。
使用结构体中的 tag,解析成 json 时,可以忽略字段
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
PName string `json:"Name"`
PAge int `json:"Age"`
}
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
//使用结构体中的 tag,解析成json时,可以忽略字段
jsonStr := `{"Web":"haicoder.net", "Name":"HaiCoder","Age":18, "Score":99.1}`
var p Person
if err := json.Unmarshal([]byte(jsonStr), &p); err != nil{
fmt.Println("Error =", err)
return
}
fmt.Println("Person =", p)
}
程序运行后,控制台输出如下:
我们定义的结构体只有两个字段,但是 json 串中有四个 key,因此,我们解析成结构体时,会自动忽略 json 串中在结构体中不存在 key。
Golang 中可以为结构体的字段添加 Tag,Golang 本身的 encoding/json 包解析 Json 使用了 Tag,一些开源的ORM 框架,也广泛使用了 Tag。
Golang 中定义结构体的 Tag,使用 ``,在解析 Json 时,可以通过 Tag 指定解析成 Json 字符串之后使用的字段名。Go 语言结构体 Tag 语法:
type User struct {
Name string `tag`
Passwd string `tag`
}