简介

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]