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

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

1. encoding/json(标准库)

简介

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

示例

import (
    "encoding/json"
    "fmt"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    jsonString := `{"name":"Alice","age":30}`
    var user User

    err := json.Unmarshal([]byte(jsonString), &user)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(user)
}

2. jsoniter

简介

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

安装

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

 示例 

import (
    "fmt"
    jsoniter "github.com/json-iterator/go"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    var json = jsoniter.ConfigCompatibleWithStandardLibrary
    jsonString := `{"name":"Alice","age":30}`
    var user User

    err := json.Unmarshal([]byte(jsonString), &user)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(user)
}

3. go-json

简介

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

安装

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

示例

import (
    "fmt"
    json "github.com/goccy/go-json"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    jsonString := `{"name":"Alice","age":30}`
    var user User

    err := json.Unmarshal([]byte(jsonString), &user)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(user)
}

4. gjson

简介

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

安装

go get -u github.com/tidwall/gjson 

示例 

import (
    "fmt"
    "github.com/tidwall/gjson"
)

func main() {
    jsonString := `{"name":"Alice","age":30}`

    // 使用 gjson 获取 name 字段
    name := gjson.Get(jsonString, "name").String()
    age := gjson.Get(jsonString, "age").Int()

    fmt.Printf("Name: %s, Age: %d\n", name, age)
}

5.GF框架中的gjson 

GF简介

    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 框架内使用时,能提供较好的集成体验,性能也很出色。

安装

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

示例

import (
    "fmt"
    "github.com/gogf/gf/v2/encoding/gjson"
)

func main() {
    jsonData := `{"name": "Alice", "age": 30, "address": {"city": "Wonderland", "zip": "12345"}}`
    j, err := gjson.LoadContent(jsonData)
    if err != nil {
        fmt.Println("Failed to parse JSON:", err)
        return
    }
    name := j.GetString("name")
    city := j.GetString("address.city")
    fmt.Println("Name:", name)
    fmt.Println("City:", city)
}

性能对比

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 也是一个很好的选择,能够在提供高性能的同时保证良好的集成体验。

你可能感兴趣的:(json,golang,开发语言,后端,运维)