想要使用 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: 37, 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":37,
"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: 37, 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":37,
"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: 37, 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":37,
"Skills":[
{
"level":1
},
{
"name":"Flash your dog eye",
"level":0
},
{
"name":"Time to have Lunch",
"level":3
}
]
}
通过对比 Skill 结构体的 Name 和 Level 字段可以看出,Name 字段的空值被忽略了,而 Level 字段则没有。
`json:" "`
标签的使用总结为以下几点:
-
FieldName int `json:"-"`
:表示该字段被本包忽略; -
FieldName int `json:"myName"`
:表示该字段在 JSON 里使用“myName”作为键名; -
FieldName int `json:"myName,omitempty"`
:表示该字段在 JSON 里使用“myName”作为键名,并且如果该字段为空时将其省略掉; -
FieldName int `json:",omitempty"`
:该字段在json里的键名使用默认值,但如果该字段为空时会被省略掉,注意 omitempty 前面的逗号不能省略。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/23460.html