Golang高效能json包:easyjson
簡介
easyjson是什麼呢? 根據官網介紹,easyjson是提供高效快速且易用的結構體structs<-->json轉換包。easyjson並沒有使用反射方式實現,所以效能比其他的json包該4-5倍,比golang 自帶的json包快2-3倍。 easyjson目標是維持生成去程式碼簡單,以致於它可以輕鬆地進行最佳化或固定。
安裝
go get -u github.com/mailru/easyjson/go install github.com/mailru/easyjson/easyjsonorgo build -o easyjson github.com/mailru/easyjson/easyjson
驗證是否安裝成功。
$ easyjsonUsage of D:Codegobineasyjson.exe: -all generate marshaler/unmarshalers for all structs in a file -build_tags string build tags to add to generated file -leave_temps do not delete temporary files -lower_camel_case use lowerCamelCase names instead of CamelCase by default -no_std_marshalers don't generate MarshalJSON/UnmarshalJSON funcs -noformat do not run 'gofmt -w' on output file -omit_empty omit empty fields by default string specify the filename of the output -pkg process the whole package instead of just the given file -snake_case use snake_case names instead of CamelCase by default -stubs only generate stubs for marshaler/unmarshaler funcs
其中有幾個選項需要注意:
-lower_camel_case:將結構體欄位field首字母改為小寫。如Name=>name。 -build_tags string:將指定的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:jsontype School struct { Name string `json:"name"` Addr string `json:"addr"`}//easyjson:jsontype Student struct { Id int `json:"id"` Name string `json:"s_name"` School School `json:"s_chool"` Birthday time.Time `json:"birthday"`}
在結構體包下執行
easyjson -all student.go
此時在該目錄下出現一個新的檔案。
// Code generated by easyjson for marshaling/unmarshaling. DO NOT EDIT.package easyjsonimport ( json "encoding/json" easyjson "github.com/mailru/easyjson" jlexer "github.com/mailru/easyjson/jlexer" jwriter "github.com/mailru/easyjson/jwriter")// suppress unused package warningvar ( _ *json.RawMessage _ *jlexer.Lexer _ *jwriter.Writer _ easyjson.Marshaler)func easyjsonB83d7b77DecodeStudygoEasyjson(in *jlexer.Lexer, out *Student) { isTopLevel := in.IsStart() if in.IsNull() { if isTopLevel { in.Consumed() } in.Skip() return } in.Delim('{') for !in.IsDelim('}') { key := in.UnsafeString() in.WantColon() if in.IsNull() { in.Skip() in.WantComma() continue } switch key { case "id": out.Id = int(in.Int()) case "s_name": out.Name = string(in.String()) case "s_chool": easyjsonB83d7b77DecodeStudygoEasyjson1(in, &out.School) case "birthday": if data := in.Raw(); in.Ok() { in.AddError((out.Birthday).UnmarshalJSON(data)) } default: in.SkipRecursive() } in.WantComma() } in.Delim('}') if isTopLevel { in.Consumed() }}func easyjsonB83d7b77EncodeStudygoEasyjson(out *jwriter.Writer, in Student) { out.RawByte('{') first := true _ = first if !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('}')}// MarshalJSON supports json.Marshaler interfacefunc (v Student) MarshalJSON() ([]byte, error) { w := jwriter.Writer{} easyjsonB83d7b77EncodeStudygoEasyjson(&w, v) return w.Buffer.BuildBytes(), w.Error}// MarshalEasyJSON supports easyjson.Marshaler interfacefunc (v Student) MarshalEasyJSON(w *jwriter.Writer) { easyjsonB83d7b77EncodeStudygoEasyjson(w, v)}// UnmarshalJSON supports json.Unmarshaler interfacefunc (v *Student) UnmarshalJSON(data []byte) error { r := jlexer.Lexer{Data: data} easyjsonB83d7b77DecodeStudygoEasyjson(&r, v) return r.Error()}// UnmarshalEasyJSON supports easyjson.Unmarshaler interfacefunc (v *Student) UnmarshalEasyJSON(l *jlexer.Lexer) { easyjsonB83d7b77DecodeStudygoEasyjson(l, v)}func easyjsonB83d7b77DecodeStudygoEasyjson1(in *jlexer.Lexer, out *School) { isTopLevel := in.IsStart() if in.IsNull() { if isTopLevel { in.Consumed() } in.Skip() return } in.Delim('{') for !in.IsDelim('}') { key := in.UnsafeString() in.WantColon() if in.IsNull() { in.Skip() in.WantComma() continue } switch key { case "name": out.Name = string(in.String()) case "addr": out.Addr = string(in.String()) default: in.SkipRecursive() } in.WantComma() } in.Delim('}') if isTopLevel { in.Consumed() }}func easyjsonB83d7b77EncodeStudygoEasyjson1(out *jwriter.Writer, in School) { out.RawByte('{') first := true _ = first if !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('}')}
現在可以寫一個測試類啦。
package mainimport ( "studygo/easyjson" "time" "fmt")func main(){ 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,"s_name":"qq","s_chool":{"name":"CUMT","addr":"xz"},"birthday":"2017-08-04T20:58:07.9894603+08:00"} <nil>{121 {CwwwwwwwUMT xzwwwww} 2017-08-04 20:52:03.4066002 +0800 CST}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4301/viewspace-2817152/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Golang 的 JSON 包GolangJSON
- golang JSON技巧GolangJSON
- Golang 流式解析 JsonGolangJSON
- 高效能的JSON logger - onelogJSON
- golang 閉包Golang
- Golang閉包Golang
- golang json處理問題GolangJSON
- 細說 Golang 的 JSON 解析GolangJSON
- Golang : cobra 包解析Golang
- golang json字串轉結構體GolangJSON字串結構體
- golang中的context包GolangContext
- Golang Context 包詳解GolangContext
- Golang : pflag 包簡介Golang
- [譯] part 7: golang 包Golang
- Golang : cobra 包簡介Golang
- golang匯入本地包Golang
- golang中struct、json、map互相轉化GolangStructJSON
- golang []byte和string的高效能轉換Golang
- golang 解析php輸出json相容問題GolangPHPJSON
- php 透過 JSON RPC 與 golang 通訊PHPJSONRPCGolang
- Golang中閉包的理解Golang
- golang flag包使用筆記Golang筆記
- golang實戰之flag包Golang
- Golang操作結構體、Map轉化為JSONGolang結構體JSON
- Golang高效實踐之interface、reflection、json實踐GolangJSON
- Golang:將日誌以Json格式輸出到KafkaGolangJSONKafka
- Json序列化在golang中的應用JSONGolang
- Golang閉包入門瞭解Golang
- Json和Map互轉,三個包(org.json/net.sf.json/com.google.gson)JSONGo
- golang常用軟體包(長期更新)Golang
- golang ssh包使用方法介紹Golang
- Golang筆記--strconv包的基本用法Golang筆記
- 轉載golang中net/http包用法GolangHTTP
- golang 專案引入私有倉庫包Golang
- Golang-import匯入包語法GolangImport
- 關於golang的time包總結Golang
- Go 之基礎速學 (七) golang 裡包的使用 JSON 化 struct 結構體以及 if else 的初次使用(二)GolangJSONStruct結構體
- java json解析jar包基本使用記錄JavaJSONJAR