FieldName int `json:-`:表示该字段被本包忽略;
FieldName int `json:myName`:表示该字段在 JSON 里使用“myName”作为键名;
FieldName int `json:myName,omitempty`:表示该字段在 JSON 里使用“myName”作为键名,并且如果该字段为空时将其省略掉;
FieldName int `json:,omitempty`:该字段在json里的键名使用默认值,但如果该字段为空时会被省略掉,注意 omitempty 前面的逗号不能省略。
JSON 格式是一种对象文本格式,是当前互联网最常用的信息交换格式之一。在Go语言中,可以使用 json.Marshal() 函数将结构体格式的数据格式化为 JSON 格式。
想要使用 json.Marshal() 函数需要我们先引入 encoding/json 包,示例代码如下:
package main
import (
encoding/json
fmt
)
func main() {
// 声明技能结构体
type Skill struct {
Name string
Level int
}
// 声明角色结构体
type Actor struct {
Name string
Age int
Skills []Skill
}
// 填充基本角色数据
a := Actor{
Name: cow boy,
Age: ,
Skills: []Skill{
{Name: Roll and roll, Level: 1},
{Name: Flash your dog eye, Level: 2},
{Name: Time to have Lunch, Level: 3},
},
}
result, err := json.Marshal(a)
if err != nil {
fmt.Println(err)
}
jsonStringData := string(result)
fmt.Println(jsonStringData)
}
运行结果如下:
{
Name:cow boy,
Age:,
Skills:[
{
Name:Roll and roll,
Level:1
},
{
Name:Flash your dog eye,
Level:2
},
{
Name:Time to have Lunch,
Level:3
}
]
}
通过运行结果可以看出我们成功的将结构体数据转换成了 JSON 格式。
提示:为了便于查看这里将输出结果做了格式化处理。
在转换 JSON 格式时,JSON 的各个字段名称默认使用结构体的名称,如果想要指定为其它的名称我们可以在声明结构体时添加一个`json: `标签,在 中可以填入我们想要的内容,代码如下所示:
package main
import (
encoding/json
fmt
)
func main() {
// 声明技能结构体
type Skill struct {
Name string `json:name`
Level int `json:level`
}
// 声明角色结构体
type Actor struct {
Name string
Age int
Skills []Skill
}
// 填充基本角色数据
a := Actor{
Name: cow boy,
Age: ,
Skills: []Skill{
{Name: Roll and roll, Level: 1},
{Name: Flash your dog eye, Level: 2},
{Name: Time to have Lunch, Level: 3},
},
}
result, err := json.Marshal(a)
if err != nil {
fmt.Println(err)
}
jsonStringData := string(result)
fmt.Println(jsonStringData)
}
运行结果如下:
{
Name:cow boy,
Age:,
Skills:[
{
name:Roll and roll,
level:1
},
{
name:Flash your dog eye,
level:2
},
{
name:Time to have Lunch,
level:3
}
]
}
通过运行结果可以看出,我们成功将 Skill 结构体的 Name 和 Level 字段转换成了想要的内容。
我们还可以在上面的标签的 中加入 omitempty(使用逗号,与前面的内容分隔),来过滤掉转换的 JSON 格式中的空值,如下所示:
package main
import (
encoding/json
fmt
)
func main() {
// 声明技能结构体
type Skill struct {
Name string `json:name,omitempty`
Level int `json:level`
}
// 声明角色结构体
type Actor struct {
Name string
Age int
Skills []Skill
}
// 填充基本角色数据
a := Actor{
Name: cow boy,
Age: ,
Skills: []Skill{
{Name: , Level: 1},
{Name: Flash your dog eye},
{Name: Time to have Lunch, Level: 3},
},
}
result, err := json.Marshal(a)
if err != nil {
fmt.Println(err)
}
jsonStringData := string(result)
fmt.Println(jsonStringData)
}
运行结果如下:
{
Name:cow boy,
Age:,
Skills:[
{
level:1
},
{
name:Flash your dog eye,
level:0
},
{
name:Time to have Lunch,
level:3
}
]
}
通过对比 Skill 结构体的 Name 和 Level 字段可以看出,Name 字段的空值被忽略了,而 Level 字段则没有。
`json: ` 标签的使用总结为以下几点: