简介

golang 中 json 的序列化可以使用 golang 官方库中自带的 encoding/json 序列化工具,也可以使用第三方库中的 json-iterator,它更加高效

encoding/json 中序列化和反序列化的方法中,被序列化的类型和 []byte 类型是需要注意的关键数据类型

序列化

序列化是将对象的状态信息转换为可以存储或传输的形式的过程,encoding/json 中 Marshal 函数返回值是一个 []byte,所以一般最后需要转成 string 打印呈现出来

关键代码还是如下

// Marshal 函数用来序列化,返回 []byte, error
sli, err := json.Marshal(结构体或者 map)

struct->json

package main

import (
	"encoding/json"
	"fmt"
)

// People 接口
type People interface {
	getName() string
}

// Child 结构体
type Child struct {
	Name string
	Age  int
}

// Child 结构体实现了 People 接口的 getName 函数
func (p *Child) getName() string {
	return p.Name
}

// 确认结构体实现了接口方法
var _ People = &Child{}

// main 主函数
func main() {
	// 一个 Child 结构体
	var p People = &Child{
		Name: "liming",
		Age:  12,
	}

	// json 序列哈
	structJson, err := json.Marshal(p)
	if err != nil {
		fmt.Println("序列化失败")
		return
	}

	// 打印序列化结果
	fmt.Println("输出序列化结果: ", string(structJson))
}

具体结果如下:

输出序列化结果:  {"Name":"liming","Age":12}

map->json

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	// 声明一个 map
	person := make(map[string]interface{})
	person["zhangsan"] = 12
	person["lisi"] = 13
	person["wangwu"] = 11

	// json 序列化
	mapJson, err := json.Marshal(&person)
	if err != nil {
		fmt.Println("序列化失败")
		return
	}

	// 打印序列化结果
	fmt.Println("输出序列化结果: ", string(mapJson))
}

具体结果如下:

输出序列化结果:  {"lisi":13,"wangwu":11,"zhangsan":12}
反序列化

通过从存储区中读取对象的状态,重新创建该对象,则为反序列化

关键代码还是如下

// Unmarshal 函数用来反序列化,返回 error,注意传入的第二参数为指针
err := json.Unmarshal([]byte, interface{})

json->struct

package main

import (
	"encoding/json"
	"fmt"
)

// People 接口
type People interface {
	getName() string
}

// Child 结构体
type Child struct {
	Name string
	Age  int
}

// Child 结构体实现了 People 接口的 getName 函数
func (p *Child) getName() string {
	return p.Name
}

// 确认结构体实现了接口方法
var _ People = &Child{}

// main 主函数
func main() {
	// json string
	jsonStr := "{\"Name\":\"liming\",\"Age\":12}"

	// People -> Child
	p := &Child{}

	// 反序列化
	err := json.Unmarshal([]byte(jsonStr), p)
	if err != nil {
		fmt.Println("反序列化失败")
		return
	}

	// 打印反序列化结果
	fmt.Printf("输出反序列化结果: %#v", p)
}

具体结果如下:

输出反序列化结果: &main.Child{Name:"liming", Age:12}

json->map

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	// json string
	jsonStr := "{\"lisi\":13,\"wangwu\":11,\"zhangsan\":12}"

	// map
	personMap := make(map[string]interface{})

	// 反序列化
	err := json.Unmarshal([]byte(jsonStr), &personMap)
	if err != nil {
		fmt.Println("反序列化失败")
		return
	}

	// 打印反序列化结果
	fmt.Printf("输出反序列化结果: %v", personMap)
}

具体结果如下:

输出反序列化结果: map[lisi:13 wangwu:11 zhangsan:12]