您应该使用哪个库?jsoniter、easyjson 还是 go-json?为什么?
JSON作为一种广泛使用的数据交换标准,在现代软件开发中几乎成为各个平台和编程语言的标准 interchange mechanism。对于像Go语言这样的现代编程语言来说,拥有内置的支持是再自然不过的事情。特别值得一提的是,在Go语言的标准库中,默认情况下就已经集成了针对RESTful API的支持,并且特别推荐使用Kubernetes框架下的API Service组件来构建高效的Web服务架构。通过内置的高效解析和生成机制,Go程序员无需额外配置即可轻松实现对JSON格式文件的读写操作。这种设计不仅简化了开发流程还显著提升了代码维护性和可扩展性。
虽然Go的生态系统在某些方面表现优异,但我们依然能在GitHub上发现许多开源的JSON解析库可供选择。这些优质资源可以帮助我们实现高效的工作目标。它们的各项特性、性能以及适用场景才是我们应当关注的重点。
Go 中的 JSON
使用 Go 的独立encode/json包操作 JSON 时有两个步骤。
建立映射关系:将结构体中的字段与其对应的JSON表示进行对应。
采用或运算符实现JSON字符串与结构体之间的转换过程:称为解序列化。
示例如下。
package main
import (
"encoding/json"
"fmt"
"os"
"time"
)
func main() {
type Customer struct {
Name string `json:"name"`
Created time.Time `json:"created"`
}
data := []byte(`
{
"name": "J.B",
"created": "2018-04-09T23:00:00Z"
}`)
var c Customer
if err := json.Unmarshal(data, &c); err != nil {
fmt.Print(err)
os.Exit(1)
}
fmt.Println(c.Name)
}
AI助手
听起来很简单嘛?它能够管理多层嵌套的 JSON 数据结构,并同时用于map操作来处理 JSON 中存在动态键的情况。
开源 Go JSON 库状态
既然Go的库看起来很完美,那么为什么Github上有这么多第三方库呢?
拉回我们的思绪,看看那些超过 1000 个 star 的 JSON 工具包。
| Json | starts | Users | createAt | last commit(yyyy-mm-dd) | contributers | issues |
|---|---|---|---|---|---|---|
| ffjson | 2.8K | 692 | 2015-05-20 | 2019-09-30 | 39 | 135 (80 closed) |
| jsoniter | 10K | 66.4K | 2016-11-30 | 2021-09-11 | 46 | 411 (286 closed) |
| easyjson | 3.4K | 21.4K | 2016-02-28 | 2021-10-10 | 80 | 172 (127 closed) |
| jsonparser | 4.2K | 1.8K | 2016-05-22 | 2021-06-10 | 47 | 112 (73 closed) |
| gojay | 2K | - | 2018-04-25 | 2019-06-11 | 17 | 72 (42 closed) |
| fastjson | 1.4K | - | 2018-05-28 | 2021-01-12 | 5 | 73(33 open, 40 closed) |
| simplejson-go | 1.2K | 97 | 2020-01-14 | 2021-06-21 | 7 | 13 (13 closed) |
| go-json | 1.2K | - | 2020-04-29 | 2021-10-16 | 13 | 91 (83 closed) |
jsoniter的选择和使用
鉴于此, 我向大家推荐使用json-iterator这个工具. 它是一个高效且功能强大的JSON解析器, 并完美支持标准库中的encoding/json接口, 并且运行速度更快. 注意到的是, 在官方宣传中提到的速度提升程度更为显著——大约是encoding/json库的6倍之多. 然而随着Go语言版本的持续优化和更新, json-iterator的表现得到了进一步提升, 在当前环境下大约是encoding/json库的两倍左右.
这个是官网提供的性能对比:

jsoniter 能够比encoding/json快的主要原因,
- 优化内存占用。
- 避免频繁的反射操作(
reflect),对于同一类型的对象,《jsoniter》仅进行一次反射后立即实施缓存机制以提高效率。
- 避免频繁的反射操作(
下载库
go get github.com/json-iterator/go
AI助手
完全兼容encoding/json
var json = jsoniter.ConfigCompatibleWithStandardLibrary
AI助手
所以对于之前提到的代码段落我们可实现与现有json.Marshal完美的兼容为此只需导入jsoniter库并在导入时将其配置为ConfigCompatibleWithStandardLibrary即可完成功能衔接
package main
import (
"github.com/json-iterator/go"
"fmt"
"os"
"time"
)
var json = jsoniter.ConfigCompatibleWithStandardLibrary
func main() {
type Customer struct {
Name string `json:"name"`
Created time.Time `json:"created"`
}
data := []byte(`
{
"name": "J.B",
"created": "2018-04-09T23:00:00Z"
}`)
var c Customer
if err := json.Unmarshal(data, &c); err != nil {
fmt.Print(err)
os.Exit(1)
}
fmt.Println(c.Name)
}
AI助手
