EasyJson是Go语言中对象序列化与反序列化的工具,类似Java中的fastjson和Jackson,能快速对对象进行序列化和反序列化,本次介绍一下使用方法。
版本信息:
go1.20.2
1,获取源码
# go get
go get -u github.com/mailru/easyjson/
2,安装
# install
go install github.com/mailru/easyjson/
如果失败,可以将项目克隆到$GOPATH/src/mailru 目录下 并将包名改为easyjson,然后进入easyjson包下的easyjson目录,运行go build 命令,再将生成的二进制文件放到$GOPATH/bin目录下并改名为easyjson
也可以将二进制文件加到环境变量里。
我的go build路径如下
/home/easton/go/src/github.com/mailru/easyjson/easyjson
3,定义model文件
easyjson需要通过model文件生成对应的序列化和反序列化方法
项目结构:
test
├── src
│ └── easyjson
│ ├── easyjson_test.go
│ ├── struct_def.go
│ └── struct_def_easyjson.go
模型文件定义struct_def.go
package easyjson
type BasicInfo struct {
Name string `json:"name"`
Age int `json:"age"`
}
type JobInfo struct {
Skills []string `json:"skills"`
}
type Employee struct {
BasicInfo BasicInfo `json:"basic_info"`
JobInfo JobInfo `json:"job_info"`
}
4,执行命令生成工具文件
cd test/src/easyjson
easyjson -all struct_def.go
生产struct_def_easyjson.go,内容如下:
// MarshalJSON supports json.Marshaler interface
func (v Employee) MarshalJSON() ([]byte, error) {
w := jwriter.Writer{}
easyjson7c82d03EncodeGoproject01Day33Easyjson1(&w, v)
return w.Buffer.BuildBytes(), w.Error
}
// MarshalEasyJSON supports easyjson.Marshaler interface
func (v Employee) MarshalEasyJSON(w *jwriter.Writer) {
easyjson7c82d03EncodeGoproject01Day33Easyjson1(w, v)
}
// UnmarshalJSON supports json.Unmarshaler interface
func (v *Employee) UnmarshalJSON(data []byte) error {
r := jlexer.Lexer{Data: data}
easyjson7c82d03DecodeGoproject01Day33Easyjson1(&r, v)
return r.Error()
}
5,测试
创建easyjson_test.go,编写单元测试和性能测试方法如下:
package easyjson
import (
"encoding/json"
"testing"
)
var jsonStr = `{
"basic_info":{
"name":"Mike",
"age":30
},
"job_info":{
"skills":["Java","Go","C"]
}
}`
func TestEasyJson(t *testing.T) {
e := Employee{}
err := e.UnmarshalJSON([]byte(jsonStr))
if err != nil {
t.Fatal("json to obj error", err.Error())
}
t.Log(e)
//对象转化为json
bytes, err1 := e.MarshalJSON()
if err1 != nil {
t.Fatal("object to json error", err1.Error())
}
t.Log(string(bytes))
}
func BenchmarkEasyJson(b *testing.B) {
b.ResetTimer()
e := Employee{}
for i := 0; i < b.N; i++ {
err := e.UnmarshalJSON([]byte(jsonStr))
if err != nil {
b.Error("EasyJson: json to object error", err.Error())
}
_, err1 := e.MarshalJSON()
if err1 != nil {
b.Error("EasyJson: object to json error", err1.Error())
}
}
}
func BenchmarkEmbeddedJson(b *testing.B) {
b.ResetTimer()
e := Employee{}
for i := 0; i < b.N; i++ {
err := json.Unmarshal([]byte(jsonStr), &e)
if err != nil {
b.Error("Embedded: json to object error", err.Error())
}
//obj to json
_, err1 := json.Marshal(e)
if err1 != nil {
b.Error("Embedded: object to json error", err1.Error())
}
}
}
测试Embedded json 与EasyJson性能对比
cd test/src/easyjson/
go test -bench=. benchmem
性能测试结果如下:
pkg: test/easyjson
BenchmarkEasyJson-10 2773292 425.5 ns/op 252 B/op 5 allocs/op
BenchmarkEmbeddedJson-10 752252 1552 ns/op 584 B/op 11 allocs/op
PASS
ok test/easyjson 2.921s
EasyJson官网地址
Github地址:https://github.com/mailru/easyjson