Golang 标准库的json.Marshal
& json.Unmarshal
方法性能并不高. 因而产生了第三方包解决此问题. 如: ffjson, json-iterator, easyjson.
但开发者在又序列化需求时一般都会使用 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}