Appearance
Go JSON 框架对比
1. 标准库
- 优点:功能完善;
- 缺点:使用反射性能较差;
2. jsoniter
GitHub - json-iterator/go 11.8k stars。
另外在 gin-gonic/gin 中也支持将默认的标准库替换为 jsoniter(例如:$ go build -tags=jsoniter)。对于一些没有提供替换接口的库,也可以通过 monkey 补丁来简单粗暴的替换掉官方编码库:
Go
// 使用 go get -u "bou.ke/monkey" 获取猴子补丁库
import (
"bou.ke/monkey"
"encoding/json"
jsoniter "github.com/json-iterator/go"
)
func MonkeyPatch() ([]byte, error) {
monkey.Patch(json.Marshal, func(v interface{}) ([]byte, error) {
println("via monkey patch")
return jsoniter.Marshal(v)
})
sjson, err := json.Marshal(&s)
if err == nil {
println(string(sjson))
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
jsoniter 的原理是用 reflect.Type 得出来的信息来直接做反射,而不依赖于 reflect.ValueOf,在 reflect.StructField 上有一个 Offset 的属性,利用这个可以计算出字段的指针值,用指针直接给对象赋值,也正是因为如此 jsoniter 对 map 类型的性能与标准库差异不大。(参考:jsoniter.com - Optimization used、golang 提高反射性能)
另外也有些地方有提到:GitHub - modern-go/reflect2
3. easyjson
GitHub - mailru/easyjson 4k stars。
- 优点:
- 使用代码生成器生成相应的方法,性能较好;
- 性能比 ffjson 好(参考:easyjson vs. ffjson);
- 缺点:
- 使用代码生成器生成相应的方法,对项目源码有一定的入侵性;
- 不完全校验 JSON 格式;
4. ffjson
GitHub - pquerna/ffjson 2.9k stars。
- 优点:使用代码生成器生成相应的方法,性能较好;
- 缺点:
- 使用代码生成器生成相应的方法,对项目源码有一定的入侵性;
- 不完全校验 JSON 格式;
5. fastjson
GitHub - valyala/fastjson 1.8k stars。
- 优点:
- 无反射,性能较好;
- 支持校验 JSON 格式;
- 缺点:没有直接将 JSON 转 Struct 或 JSON 转 map 的方法;
6. gjson
- 缺点:不校验 JSON 格式;
后面有空再完善。
7. jsonparser
- 缺点:不校验 JSON 格式;
后面有空再完善。
8. sonic
后面有空再完善。