Advertisement

您应该使用哪个库?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助手

全部评论 (0)

还没有任何评论哟~