Open isayme opened 5 years ago
Golang 标准库的json.Marshal & json.Unmarshal 方法性能并不高. 因而产生了第三方包解决此问题. 如: ffjson, json-iterator, easyjson.
json.Marshal
json.Unmarshal
但开发者在又序列化需求时一般都会使用 encoding/json 的 json.* 系方法. 第三方包需要新增依赖, 在性能不是瓶颈时自然更倾向于使用官方原生包. 毕竟官方包也会持续对性能做改进.
encoding/json
json.*
但如果真有需要替换掉json.Marshal 时又如何做呢? 解决方法是 Monkey patching in Go:
package main import ( "encoding/json" "fmt" "github.com/bouk/monkey" jjson "github.com/json-iterator/go" ) type User struct { Name string `json:"name"` Emails []string `json:"emails"` } func main() { monkey.Patch(json.Marshal, func(v interface{}) ([]byte, error) { fmt.Println("use jsoniter") return jjson.Marshal(v) }) u := User{} if b, err := json.Marshal(u); err != nil { fmt.Println("Marshal failed: ", err) } else { fmt.Println(err, string(b)) } }
虽然使用的还是 json.Marshal, 实际调用的已经是 Patch 后的方法. 此代码输出:
use jsoniter <nil> {"name":"","emails":null}
Golang 标准库的
json.Marshal
&json.Unmarshal
方法性能并不高. 因而产生了第三方包解决此问题. 如: ffjson, json-iterator, easyjson.但开发者在又序列化需求时一般都会使用
encoding/json
的json.*
系方法. 第三方包需要新增依赖, 在性能不是瓶颈时自然更倾向于使用官方原生包. 毕竟官方包也会持续对性能做改进.但如果真有需要替换掉
json.Marshal
时又如何做呢? 解决方法是 Monkey patching in Go:虽然使用的还是
json.Marshal
, 实际调用的已经是 Patch 后的方法. 此代码输出:参考资料