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]