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

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 导入JSON解析:首先需要将JSON解析导入项目中,可以通过Maven或Gradle等方式引入。 2. 创建JSON对象:使用JSON解析提供的方法,根据JSON字符串创建一个JSON对象。 3. 解析JSON数据:可以通过JSON对象提供的方法,获取其中的数据。 4. 遍历JSON数据:可以使用循环结构,遍历JSON数据,获取其中的所有数据。 5. 转换JSON数据:可以将JSON数据转换为Java对象或其他类型的数据,方便后续的操作。 6. 错误处理:在解析JSON数据的过程中,可能会出现错误,需要进行错误处理,保证程序的正常运行。 下面是一个使用Jackson解析JSON数据的示例代码: ```java import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; public class JsonParser { public static void main(String[] args) { String jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}"; ObjectMapper objectMapper = new ObjectMapper(); try { // 创建JSON对象 JsonNode jsonNode = objectMapper.readTree(jsonString); // 获取JSON数据 String name = jsonNode.get("name").asText(); int age = jsonNode.get("age").asInt(); String city = jsonNode.get("city").asText(); // 输出JSON数据 System.out.println("Name: " + name); System.out.println("Age: " + age); System.out.println("City: " + city); } catch (IOException e) { e.printStackTrace(); } } } ``` 在示例代码中,我们使用了Jackson提供的ObjectMapper类来解析JSON数据。首先,我们将一个JSON字符串转换为JSON对象;然后,通过get()方法获取JSON数据;最后,将获取的数据输出到控制台上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值