
Go语言将结构体数据保存为JSON格式数据
发布时间:2022-08-26 15:32:49
JSON格式是一种用途广泛的对象文本格式。在Go语言中,结构体可以通过系统提供的json.Marshal()函数进行序列化。为了演示怎样通过反射获取结构体成员及各种值的过程,下面使用反射将结构体序列化为文本数据。
数据结构及入口函数
将结构体序列化为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: "cowboy",
Age: 37,
Skills: []Skill{
{
Name: "Rollandroll",
Level: 1,
},
{
Name: "Flashyourdogeye",
Level: 2,
},
{
Name: "TimetohaveLunch",
Level: 3,
},
},
}
result, err := json.Marshal(a)
if err == nil {
//fmt.Println(result)
fmt.Println(string(result))
} else {
fmt.Println(err)
}
}
代码说明如下:
- 第4~15行声明了一些结构体,用于描述一个角色的信息。
- 第18~27行,实例化了Actor结构体,并且填充了一些基本的角色数据。
- 第29行,调用自己实现的MarshalJson()函数,将Actor实例化的数据转换为JSON字符串。
- 第30行,如果操作成功将打印出数据。
- 第32行,如果操作有错误将打印错误。
完整代码输出如下:
{"Name":"cowboy","Age":37,"Skills":[{"Name":"Rollandroll","Level":1},{"Name":"Flashyourdogeye","Level":2},{"Name":"TimetohaveLunch","Level":3}]}
序列化主函数
json.Marshal()是序列化过程的主要函数入口,通过这个函数会调用不同类型的子序列化函数。Marshal()传入一个interface{}的数据,并将这个数据转换为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: "cowboy",
Age: 37,
Skills: []Skill{
{
Name: "Rollandroll",
Level: 1,
},
{
Name: "Flashyourdogeye",
Level: 2,
},
{
Name: "TimetohaveLunch",
Level: 3,
},
},
}
result, err := json.Marshal(a)
if err == nil {
fmt.Println(string(result))
} else {
fmt.Println(err)
}
fmt.Printf("------------%s---------------\n", "Unmarshal")
var actorData Actor
unmarshalValErr := json.Unmarshal(result, &actorData)
if unmarshalValErr == nil {
fmt.Println(actorData)
} else {
fmt.Println(err)
}
}
结果:
% go run jsonDemo1.go
{"Name":"cowboy","Age":37,"Skills":[{"Name":"Rollandroll","Level":1},{"Name":"Flashyourdogeye","Level":2},{"Name":"TimetohaveLunch","Level":3}]}
------------Unmarshal---------------
{cowboy 37 [{Rollandroll 1} {Flashyourdogeye 2} {TimetohaveLunch 3}]}