golang easyJson 包的使用

本文介绍了golang的easyJson包,一个用于JSON序列化和反序列化的工具,其性能相比标准库能提升三倍以上。文章详细讲解了安装过程、如何生成序列化方法、使用示例以及性能对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

golang easyJson 包的使用

easyjson 是用来快速进行json序列化与反序列化的工具包,通过给我们要进行序列化的struct生成方法来实现不通过反射进行json序列化,对比golang原有json工具包,性能能够提高3倍以上。

github地址:https://github.com/mailru/easyjson

一 安装:

​ 官网推荐使用:

# install
go get -u github.com/mailru/easyjson/...

​ 如果失败,可以将项目克隆到$GOPATH/src/mailru 目录下 并将包名改为easyjson,然后进入easyjson包下的easyjson目录,运行go build 命令,再将生成的二进制文件放到$GOPATH/bin目录下并改名为easyjson

我的go build 文件路径

/home/luslin/go/src/github.com/mailru/easyjson/easyjson

二 生成文件:

项目文件路径:

tests/(在gopath目录下)
└── src
    ├── json_test.go
    └── models
        ├── models_easyjson.go	(easyjson命令生成的文件)
        └── models.go	(模型文件)

Easyjson 命令工具使用时models文件需要在gopath路径下,并且要生成json方法的struct上面要加上//easyjson声明,例如:

package models

//easyjson
type User struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

命令行中运行:

easyjson -all models.go

会看到文件夹下生成 models_easyjson.go 文件,查看内容,会发现文件给User struct 添加了四个方法

// MarshalJSON supports json.Marshaler interface
func (v User) MarshalJSON() ([]byte, error) {
	w := jwriter.Writer{}
	easyjsonD2b7633eEncodeTestsSrcModels(&w, v)
	return w.Buffer.BuildBytes(), w.Error
}

// MarshalEasyJSON supports easyjson.Marshaler interface
func (v User) MarshalEasyJSON(w *jwriter.Writer) {
	easyjsonD2b7633eEncodeTestsSrcModels(w, v)
}

// UnmarshalJSON supports json.Unmarshaler interface
func (v *User) UnmarshalJSON(data []byte) error {
	r := jlexer.Lexer{Data: data}
	easyjsonD2b7633eDecodeTestsSrcModels(&r, v)
	return r.Error()
}

// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
func (v *User) UnmarshalEasyJSON(l *jlexer.Lexer) {
	easyjsonD2b7633eDecodeTestsSrcModels(l, v)
}

三 方法使用

1 将struct 序列化成json格式

func TestMarshal(t *testing.T)  {
	u1 := models.User{"teststruct",12}
	ujs,_ := json.Marshal(u1)
	fmt.Println(string(ujs),reflect.TypeOf(ujs))
}
结果:
{"name":"teststruct","age":12} []uint8

2 将json序列化成struct

func TestUnmarshal(t *testing.T) {
	u1 := models.User{"teststruct",12}
	ujs,_ := json.Marshal(u1)
	u2 := models.User{}
	_ = u2.UnmarshalJSON(ujs)
	fmt.Println(u2,reflect.TypeOf(u2))
}
结果:
{teststruct 12} models.User

四 性能对比

通过Benchmark来对比进行序列化与反序列化时easyjson与原json的性能

func BenchmarkEasyJson(t *testing.B)  {
	u1 := models.User{"teststruct",12}
	u2 := models.User{}
	for i:=0;i<t.N;i++{
		ujs,_ := u1.MarshalJSON()
		_ = u2.UnmarshalJSON(ujs)
	}
}



func BenchmarkJson(t *testing.B)  {
	u1 := models.User{"teststruct",12}
	u2 := models.User{}
	for i:=0;i<t.N;i++{
		ujs,_ := json.Marshal(u1)
		_ = json.Unmarshal(ujs,u2)
	}
}

运行

go test -bench="."

结果:

goos: linux
goarch: amd64
pkg: tests/src
BenchmarkEasyJson-4      5000000               366 ns/op
BenchmarkJson-4          1000000              1146 ns/op
PASS

性能大约为原json包的三倍左右

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值