Go语言将结构体数据保存为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: 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:" "`标签,在" "中可以填入我们想要的内容,代码如下所示:
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
}
]
}
我们还可以在上面的标签的
" "中加入 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
}
]
}
`json:" "` 标签的使用总结为以下几点:
-
FieldName int `json:"-"`:表示该字段被本包忽略; -
FieldName int `json:"myName"`:表示该字段在 JSON 里使用“myName”作为键名; -
FieldName int `json:"myName,omitempty"`:表示该字段在 JSON 里使用“myName”作为键名,并且如果该字段为空时将其省略掉; -
FieldName int `json:",omitempty"`:该字段在json里的键名使用默认值,但如果该字段为空时会被省略掉,注意 omitempty 前面的逗号不能省略。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算