0


使用go语言高效解析json详解(含多个json库的对比)

在 Go 语言中,解析 JSON 性能的优劣取决于所使用的库。以下是对比 encoding/json、jsoniter、go-json 和 gjson 的性能分析和推荐:

1. encoding/json(标准库)

简介

  1. encoding/json Go 语言的标准库,易用性高且内置于 Go 语言中。然而,由于依赖于反射机制,它在高并发和大数据处理时性能较低。对于基本的应用场景,encoding/json 完全够用,但在追求高性能的应用中可能成为瓶颈。

示例

  1. import (
  2. "encoding/json"
  3. "fmt"
  4. )
  5. type User struct {
  6. Name string `json:"name"`
  7. Age int `json:"age"`
  8. }
  9. func main() {
  10. jsonString := `{"name":"Alice","age":30}`
  11. var user User
  12. err := json.Unmarshal([]byte(jsonString), &user)
  13. if err != nil {
  14. fmt.Println(err)
  15. }
  16. fmt.Println(user)
  17. }

2. jsoniter

简介

  1. jsoniter 是一个高性能的 JSON 解析库,自称比标准库快三倍。它通过优化反射和内存分配机制,提高了解析速度。在大多数基准测试中,jsoniter 显示出比 encoding/json 更好的性能,特别是在处理大数据量和复杂 JSON 结构时。

安装

  1. go get -u github.com/json-iterator/go

示例

  1. import (
  2. "fmt"
  3. jsoniter "github.com/json-iterator/go"
  4. )
  5. type User struct {
  6. Name string `json:"name"`
  7. Age int `json:"age"`
  8. }
  9. func main() {
  10. var json = jsoniter.ConfigCompatibleWithStandardLibrary
  11. jsonString := `{"name":"Alice","age":30}`
  12. var user User
  13. err := json.Unmarshal([]byte(jsonString), &user)
  14. if err != nil {
  15. fmt.Println(err)
  16. }
  17. fmt.Println(user)
  18. }

3. go-json

简介

  1. go-json 也以其高性能著称,特别是在内存分配和速度方面表现优异。与 jsoniter 类似,go-json 旨在提高解析和编码的效率,常常被认为比 jsoniter 还要快一些,特别是在特定场景下的性能优化更为显著。

安装

  1. go get -u github.com/goccy/go-json

示例

  1. import (
  2. "fmt"
  3. json "github.com/goccy/go-json"
  4. )
  5. type User struct {
  6. Name string `json:"name"`
  7. Age int `json:"age"`
  8. }
  9. func main() {
  10. jsonString := `{"name":"Alice","age":30}`
  11. var user User
  12. err := json.Unmarshal([]byte(jsonString), &user)
  13. if err != nil {
  14. fmt.Println(err)
  15. }
  16. fmt.Println(user)
  17. }

4. gjson

简介

  1. gjson 专注于从 JSON 字符串中快速获取值,而无需进行复杂的结构体定义或反序列化。它在读取特定字段时表现出极高的效率,但不适合需要完整解析和反序列化的场景。对于简单的 JSON 提取操作,gjson 非常方便且快速。

安装

  1. go get -u github.com/tidwall/gjson

示例

  1. import (
  2. "fmt"
  3. "github.com/tidwall/gjson"
  4. )
  5. func main() {
  6. jsonString := `{"name":"Alice","age":30}`
  7. // 使用 gjson 获取 name 字段
  8. name := gjson.Get(jsonString, "name").String()
  9. age := gjson.Get(jsonString, "age").Int()
  10. fmt.Printf("Name: %s, Age: %d\n", name, age)
  11. }

5.GF框架中的gjson

GF简介

  1. GF 框架,全称为 GoFrame,是一个面向现代 Web 和服务器应用程序开发的高性能 Go 语言开发框架。它旨在提供简洁、优雅、高效的开发体验,帮助开发者快速构建复杂的 Web 应用和微服务。

使用了GF框架的著名项目

OpenSCRM: 基于 Go 和 React 的企业微信私域流量管理系统,适用于管理企业微信和私域流量的解决方案。它提供了高质量的代码和丰富的功能。
BIFrost: 面向生产环境的 MySQL 和 MariaDB 数据同步工具,可以将数据同步到 Redis、MongoDB、ClickHouse 等多种服务。
IOTFast: 基于 GoFrame 和 vue-next-admin 的物联网平台,适用于各种 IoT 设备的管理和数据处理。
Focus: 一个社区系统项目,使用 GoFrame 作为后端框架,前端采用 jQuery 和 Bootstrap,数据库使用 MySQL。
gf2-demo: 一个用于快速开发后端服务的脚手架项目,旨在帮助开发者专注于业务逻辑编写,并快速交付项目。

GF 框架的主要特性

1).模块化设计:GF 提供了高度模块化的设计,可以根据需要引入不同的功能模块,降低代码耦合度,提高代码复用性。

2).高性能:GF 对性能进行了深度优化,支持高并发和高负载的应用场景,适合构建大规模的互联网服务。

3).丰富的工具库:GF 提供了丰富的工具库,包括配置管理、日志记录、数据库操作、缓存管理等,极大简化了开发工作。

4).RESTful 支持:内置对 RESTful API 的友好支持,方便开发现代 Web 服务。

5).自动化任务:支持定时任务、延时任务等自动化任务管理。

6).简洁的路由管理:提供灵活、简洁的路由管理功能,支持各种路由方式,包括静态路由、动态路由、中间件等。

7).完善的文档:GF 提供了详细的开发文档和丰富的示例代码,帮助开发者快速上手。

简介

gf 框架中的 JSON 解析库,提供了丰富的功能和良好的性能,特别是在 GF 框架内使用时,能提供较好的集成体验,性能也很出色。

安装

  1. go get -u github.com/gogf/gf/v2/encoding/gjson

示例

  1. import (
  2. "fmt"
  3. "github.com/gogf/gf/v2/encoding/gjson"
  4. )
  5. func main() {
  6. jsonData := `{"name": "Alice", "age": 30, "address": {"city": "Wonderland", "zip": "12345"}}`
  7. j, err := gjson.LoadContent(jsonData)
  8. if err != nil {
  9. fmt.Println("Failed to parse JSON:", err)
  10. return
  11. }
  12. name := j.GetString("name")
  13. city := j.GetString("address.city")
  14. fmt.Println("Name:", name)
  15. fmt.Println("City:", city)
  16. }

性能对比

1.标准库 encoding/json:适合常规使用,易用性高,但性能在高负载情况下较低。

2.jsoniter:性能显著优于标准库,适合需要处理大量 JSON 数据的应用。

3.go-json:在性能上可能优于 jsoniter,特别是在内存分配优化上有独特优势。

4.gjson:最适合快速提取 JSON 字段,不适合完整的 JSON 解析和反序列化。


总结

对于最好的性能表现,go-json 和 jsoniter 是优先选择。tidwall/gjson 在需要快速提取特定字段时性能最佳。如果使用 GF 框架,github.com/gogf/gf/v2/encoding/gjson 也是一个很好的选择,能够在提供高性能的同时保证良好的集成体验。


本文转载自: https://blog.csdn.net/a1546464545454/article/details/139888146
版权归原作者 memories198 所有, 如有侵权,请联系我们删除。

“使用go语言高效解析json详解(含多个json库的对比)”的评论:

还没有评论