简介
easyjson是什么呢? 根据官网介绍,easyjson是提供高效快速且易用的结构体structs<-->json转换包。easyjson并没有使用反射方式实现,所以性能比其他的json包该4-5倍,比golang 自带的json包快2-3倍。 easyjson目标是维持生成去代码简单,以致于它可以轻松地进行优化或固定。
安装
goget-ugithub.com/mailru/easyjson/goinstallgithub.com/mailru/easyjson/easyjsonorgobuild-oeasyjsongithub.com/mailru/easyjson/easyjson
验证是否安装成功。
$easyjson UsageofD:\Code\go\bin\easyjson.exe: -allgeneratemarshaler/unmarshalersforallstructsinafile -build_tagsstringbuildtagstoaddtogeneratedfile -leave_tempsdonotdeletetemporaryfiles -lower_camel_caseuselowerCamelCasenamesinsteadofCamelCasebydefault -no_std_marshalersdon'tgenerateMarshalJSON/UnmarshalJSONfuncs -noformatdonotrun'gofmt-w'onoutputfile -omit_emptyomitemptyfieldsbydefault string specifythefilenameoftheoutput -pkgprocessthewholepackageinsteadofjustthegivenfile -snake_caseusesnake_casenamesinsteadofCamelCasebydefault -stubsonlygeneratestubsformarshaler/unmarshalerfuncs
其中有几个选项需要注意:
-lower_camel_case:将结构体字段field首字母改为小写。如Name=>name。 -build_tagsstring:将指定的string生成到生成的go文件头部。 -no_std_marshalers:不为结构体生成MarshalJSON/UnmarshalJSON函数。 -omit_empty:没有赋值的field可以不生成到json,否则field为该字段类型的默认值。-output_filename:定义生成的文件名称。-pkg:对包内指定有`//easyjson:json`结构体生成对应的easyjson配置。-snke_case:可以下划线的field如`Name_Student`改为`name_student`。
使用
记得在需要使用easyjson
的结构体上加上//easyjson:json
。 如下:
//easyjson:jsontypeSchoolstruct{Namestring`json:"name"` Addrstring`json:"addr"`}//easyjson:jsontypeStudentstruct{ Idint`json:"id"` Namestring`json:"s_name"` SchoolSchool`json:"s_chool"` Birthdaytime.Time`json:"birthday"`}
在结构体包下执行
easyjson-allstudent.go
此时在该目录下出现一个新的文件。
//Codegeneratedbyeasyjsonformarshaling/unmarshaling.DONOTEDIT.packageeasyjsonimport( json"encoding/json" easyjson"github.com/mailru/easyjson" jlexer"github.com/mailru/easyjson/jlexer" jwriter"github.com/mailru/easyjson/jwriter")//suppressunusedpackagewarningvar( _*json.RawMessage _*jlexer.Lexer _*jwriter.Writer _easyjson.Marshaler)funceasyjsonB83d7b77DecodeStudygoEasyjson(in*jlexer.Lexer,out*Student){ isTopLevel:=in.IsStart()ifin.IsNull(){ifisTopLevel{in.Consumed() }in.Skip()return }in.Delim('{')for!in.IsDelim('}'){ key:=in.UnsafeString()in.WantColon()ifin.IsNull(){in.Skip()in.WantComma()continue }switchkey{case"id":out.Id=int(in.Int())case"s_name":out.Name=string(in.String())case"s_chool": easyjsonB83d7b77DecodeStudygoEasyjson1(in,&out.School)case"birthday":ifdata:=in.Raw();in.Ok(){in.AddError((out.Birthday).UnmarshalJSON(data)) }default:in.SkipRecursive() }in.WantComma() }in.Delim('}')ifisTopLevel{in.Consumed() } }funceasyjsonB83d7b77EncodeStudygoEasyjson(out*jwriter.Writer,inStudent){out.RawByte('{') first:=true _=firstif!first{out.RawByte(',') } first=false out.RawString("\"id\":")out.Int(int(in.Id))if!first{out.RawByte(',') } first=false out.RawString("\"s_name\":")out.String(string(in.Name))if!first{out.RawByte(',') } first=false out.RawString("\"s_chool\":") easyjsonB83d7b77EncodeStudygoEasyjson1(out,in.School)if!first{out.RawByte(',') } first=false out.RawString("\"birthday\":")out.Raw((in.Birthday).MarshalJSON())out.RawByte('}') }//MarshalJSONsupportsjson.Marshalerinterfacefunc(vStudent)MarshalJSON()([]byte,error){ w:=jwriter.Writer{} easyjsonB83d7b77EncodeStudygoEasyjson(&w,v)returnw.Buffer.BuildBytes(),w.Error }//MarshalEasyJSONsupportseasyjson.Marshalerinterfacefunc(vStudent)MarshalEasyJSON(w*jwriter.Writer){ easyjsonB83d7b77EncodeStudygoEasyjson(w,v) }//UnmarshalJSONsupportsjson.Unmarshalerinterfacefunc(v*Student)UnmarshalJSON(data[]byte)error{ r:=jlexer.Lexer{Data:data} easyjsonB83d7b77DecodeStudygoEasyjson(&r,v)returnr.Error() }//UnmarshalEasyJSONsupportseasyjson.Unmarshalerinterfacefunc(v*Student)UnmarshalEasyJSON(l*jlexer.Lexer){ easyjsonB83d7b77DecodeStudygoEasyjson(l,v) }funceasyjsonB83d7b77DecodeStudygoEasyjson1(in*jlexer.Lexer,out*School){ isTopLevel:=in.IsStart()ifin.IsNull(){ifisTopLevel{in.Consumed() }in.Skip()return }in.Delim('{')for!in.IsDelim('}'){ key:=in.UnsafeString()in.WantColon()ifin.IsNull(){in.Skip()in.WantComma()continue }switchkey{case"name":out.Name=string(in.String())case"addr":out.Addr=string(in.String())default:in.SkipRecursive() }in.WantComma() }in.Delim('}')ifisTopLevel{in.Consumed() } }funceasyjsonB83d7b77EncodeStudygoEasyjson1(out*jwriter.Writer,inSchool){out.RawByte('{') first:=true _=firstif!first{out.RawByte(',') } first=false out.RawString("\"name\":")out.String(string(in.Name))if!first{out.RawByte(',') } first=false out.RawString("\"addr\":")out.String(string(in.Addr))out.RawByte('}') }
现在可以写一个测试类啦。
packagemainimport("studygo/easyjson" "time" "fmt")funcmain(){ s:=easyjson.Student{ Id:11,Name:"qq",School:easyjson.School{ Name:"CUMT",Addr:"xz",},Birthday:time.Now(),} bt,err:=s.MarshalJSON() fmt.Println(string(bt),err) json:=`{"id":11,"s_name":"qq","s_chool":{"name":"CUMT","addr":"xz"},"birthday":"2017-08-04T20:58:07.9894603+08:00"}` ss:=easyjson.Student{} ss.UnmarshalJSON([]byte(json)) fmt.Println(ss) }
运行结果:
{"id":11,"birthday":"2017-08-04T20:58:07.9894603+08:00"}<nil> {121{CwwwwwwwUMTxzwwwww}2017-08-0420:52:03.4066002+0800CST}