golang 中 json 序列化和反序列化除了使用自带的 encoding/json 库之外,还可以使用第三方的 “github.com/json-iterator/go” 库,json_iterator 工具号称是最快的序列化和反序列化 json 工具,Jsoniter Golang 版本的编解码能力比普通 encoding/json 库快 6 倍
实际中具体的 Marshal 和 Unmashal 函数和 enncoding/json 中序列化和反序列化函数的入参和返回值是一样的,只不过使用 jsoniter 需要在序列化或者反序列化之前声明一下使用 json-iterator 内置序列化库
jsonIterator := jsoniter.ConfigCompatibleWithStandardLibrary
序列化
struct->json
package main
import (
"fmt"
jsoniter "github.com/json-iterator/go"
)
// 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-iterator 内置序列化库
jsonIterator := jsoniter.ConfigCompatibleWithStandardLibrary
// struct
var p People = &Child{
Name: "zhangsan",
Age: 12,
}
// 序列化
structJson, err := jsonIterator.Marshal(p)
if err != nil {
fmt.Println("序列化失败")
return
}
// 打印输出结果
fmt.Println("输出序列化结果: ", string(structJson))
}
结果如下:
输出序列化结果: {"Name":"zhangsan","Age":12}
map->json
package main
import (
"fmt"
jsoniter "github.com/json-iterator/go"
)
// main 主函数
func main() {
// 使用 json-iterator 内置序列化库
jsonIterator := jsoniter.ConfigCompatibleWithStandardLibrary
// map
personMap := make(map[string]interface{})
personMap["zhangsan"] = 11
personMap["lisi"] = 13
personMap["wangwu"] = 12
// 序列化
structJson, err := jsonIterator.Marshal(&personMap)
if err != nil {
fmt.Println("序列化失败")
return
}
// 打印输出结果
fmt.Println("输出序列化结果: ", string(structJson))
}
结果如下:
输出序列化结果: {"lisi":13,"wangwu":12,"zhangsan":11}
反序列化
json->struct
package main
import (
"fmt"
jsoniter "github.com/json-iterator/go"
)
// 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-iterator 内置序列化库
jsonIterator := jsoniter.ConfigCompatibleWithStandardLibrary
// json string
jsonStr := "{\"Name\":\"zhangsan\",\"Age\":12}"
// People -> Child
var p People = new(Child)
// 反序列化
err := jsonIterator.Unmarshal([]byte(jsonStr), p)
if err != nil {
fmt.Println("反序列化失败")
return
}
// 打印输出结果
fmt.Printf("输出反序列化结果: %#v", p)
}
结果如下:
输出反序列化结果: &main.Child{Name:"zhangsan", Age:12}
json->map
package main
import (
"fmt"
jsoniter "github.com/json-iterator/go"
)
// main 主函数
func main() {
// 使用 json-iterator 内置序列化库
jsonIterator := jsoniter.ConfigCompatibleWithStandardLibrary
// json string
jsonStr := "{\"lisi\":13,\"wangwu\":12,\"zhangsan\":11}"
// map
personMap := map[string]interface{}{}
// 反序列化
err := jsonIterator.Unmarshal([]byte(jsonStr), &personMap)
if err != nil {
fmt.Println("反序列化失败")
return
}
// 打印输出结果
fmt.Printf("输出反序列化结果: %v", personMap)
}
结果如下:
输出反序列化结果: map[lisi:13 wangwu:12 zhangsan:11]