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}]}