Go处理JSON数组字符串的常用第三方库代码示例

 更新时间:2025年09月19日 09:14:33   作者:学亮编程手记  
在Go语言中,处理JSON数组是一项常见的任务,JSON(JavaScript Object Notation)是一种常用的数据交换格式,而数组是其中一种重要的数据结构,本文将介绍如何使用Go语言处理JSON数组字符串,并提供相应的源代码和描述,需要的朋友可以参考下

对于 JSON 数组字符串的处理,Go 提供了多种方式。同时也有一些高效的第三方库可供选择。

1. 使用标准库处理 JSON 数组

基本数组处理

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

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

func main() {
    // JSON 数组字符串
    jsonArrayStr := `[
        {"name":"张三","age":25},
        {"name":"李四","age":30},
        {"name":"王五","age":28}
    ]`

    // 方法1: 解析到结构体切片
    var users []User
    err := json.Unmarshal([]byte(jsonArrayStr), &users)
    if err != nil {
        log.Fatal("JSON 解析错误:", err)
    }

    for _, user := range users {
        fmt.Printf("姓名: %s, 年龄: %d\n", user.Name, user.Age)
    }

    // 方法2: 解析到 interface{} 切片
    var data []map[string]interface{}
    err = json.Unmarshal([]byte(jsonArrayStr), &data)
    if err != nil {
        log.Fatal("JSON 解析错误:", err)
    }

    for _, item := range data {
        fmt.Printf("姓名: %v, 年龄: %v\n", item["name"], item["age"])
    }
}

流式处理大数组

func streamJSONArray() {
    jsonArrayStr := `[
        {"name":"用户1","age":20},
        {"name":"用户2","age":25},
        {"name":"用户3","age":30}
    ]`

    reader := strings.NewReader(jsonArrayStr)
    decoder := json.NewDecoder(reader)

    // 读取开始数组标记
    token, err := decoder.Token()
    if err != nil || token != json.Delim('[') {
        log.Fatal("不是有效的 JSON 数组")
    }

    // 逐个解码数组元素
    for decoder.More() {
        var user User
        if err := decoder.Decode(&user); err != nil {
            log.Fatal("解码错误:", err)
        }
        fmt.Printf("流式读取: %+v\n", user)
    }
}

2. 高效的第三方库推荐

2.1 json-iterator/go - 高性能 JSON 库

go get github.com/json-iterator/go
import jsoniter "github.com/json-iterator/go"

func useJsonIterator() {
    jsonArrayStr := `[{"name":"张三","age":25},{"name":"李四","age":30}]`
    
    var json = jsoniter.ConfigCompatibleWithStandardLibrary
    var users []User
    
    err := json.Unmarshal([]byte(jsonArrayStr), &users)
    if err != nil {
        log.Fatal("JSON 解析错误:", err)
    }
    
    fmt.Println("json-iterator 解析结果:", users)
}

2.2 gjson - 快速 JSON 查询

go get github.com/tidwall/gjson
import "github.com/tidwall/gjson"

func useGJSON() {
    jsonArrayStr := `[
        {"name":"张三","age":25,"active":true},
        {"name":"李四","age":30,"active":false},
        {"name":"王五","age":28,"active":true}
    ]`

    // 快速查询特定字段
    result := gjson.Get(jsonArrayStr, "#.name")
    fmt.Println("所有姓名:", result.Array())

    // 获取第一个用户的年龄
    age := gjson.Get(jsonArrayStr, "0.age")
    fmt.Println("第一个用户年龄:", age.Int())

    // 条件查询
    activeUsers := gjson.Get(jsonArrayStr, `#(active==true)#`)
    activeUsers.ForEach(func(key, value gjson.Result) bool {
        fmt.Println("活跃用户:", value.Get("name").String())
        return true
    })
}

2.3 fastjson - 极速 JSON 解析

go get github.com/valyala/fastjson
import "github.com/valyala/fastjson"

func useFastJSON() {
    jsonArrayStr := `[{"name":"张三","age":25},{"name":"李四","age":30}]`
    
    var p fastjson.Parser
    v, err := p.Parse(jsonArrayStr)
    if err != nil {
        log.Fatal("解析错误:", err)
    }

    array, err := v.Array()
    if err != nil {
        log.Fatal("不是数组:", err)
    }

    for i, item := range array {
        fmt.Printf("用户%d: 姓名=%s, 年龄=%d\n",
            i,
            string(item.GetStringBytes("name")),
            item.GetInt("age"))
    }
}

2.4 go-json - 替代标准库的高性能实现

go get github.com/goccy/go-json
import "github.com/goccy/go-json"

func useGoJSON() {
    jsonArrayStr := `[{"name":"张三","age":25},{"name":"李四","age":30}]`
    
    var users []User
    err := json.Unmarshal([]byte(jsonArrayStr), &users)
    if err != nil {
        log.Fatal("JSON 解析错误:", err)
    }
    
    fmt.Println("go-json 解析结果:", users)
}

3. 性能对比和使用场景

性能排序(通常):

  1. fastjson - 最快,但API较复杂
  2. json-iterator/go - 性能很好,API兼容标准库
  3. go-json - 性能优秀,API完全兼容标准库
  4. gjson - 查询性能优秀,适合部分读取
  5. 标准库 - 稳定但相对较慢

推荐使用场景:

  • 需要极致性能:fastjson 或 json-iterator
  • 兼容性和性能平衡:json-iterator 或 go-json
  • 只需要查询部分字段:gjson
  • 生产环境稳定性:标准库或 json-iterator

4. 基准测试示例

func benchmarkJSONLibraries() {
    // 生成测试数据
    users := make([]User, 1000)
    for i := 0; i < 1000; i++ {
        users[i] = User{Name: fmt.Sprintf("用户%d", i), Age: i % 60 + 18}
    }
    
    jsonData, _ := json.Marshal(users)
    jsonStr := string(jsonData)
    
    // 可以在这里添加各个库的性能测试代码
    fmt.Printf("测试数据大小: %d bytes\n", len(jsonStr))
}

选择哪个库取决于你的具体需求:如果需要最好的性能,推荐 json-iterator 或 fastjson;如果需要简单的查询功能,gjson 是不错的选择。

以上就是Go处理JSON数组字符串的常用第三方库代码示例的详细内容,更多关于Go处理JSON数组字符串的资料请关注脚本之家其它相关文章!

相关文章

  • 聊聊golang的defer的使用

    聊聊golang的defer的使用

    这篇文章主要介绍了聊聊golang的defer的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • go语言beego框架分页器操作及接口频率限制示例

    go语言beego框架分页器操作及接口频率限制示例

    这篇文章主要为大家介绍了go语言beego框架分页器操作使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • Golang中http包的具体使用

    Golang中http包的具体使用

    Go语言内置的net/http包十分优秀,提供了http客户端和服务器的实现,本文主要介绍了Golang中http包的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • 使用Go语言进行条件编译的示例代码

    使用Go语言进行条件编译的示例代码

    Go的条件编译主要通过构建标签(build tags)和构建约束(build constraints)来实现,这些标签和约束可以让我们针对不同的操作系统、架构或特定条件编写特定代码,本文给大家介绍了如何使用Go语言进行条件编译,需要的朋友可以参考下
    2024-06-06
  • Golang实现读取ZIP压缩包并显示Gin静态html网站

    Golang实现读取ZIP压缩包并显示Gin静态html网站

    这篇文章主要为大家详细介绍了如何通过Golang实现从ZIP压缩包读取内容并作为Gin静态网站显示,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-07-07
  • go等待一组协程结束的操作方式

    go等待一组协程结束的操作方式

    这篇文章主要介绍了go等待一组协程结束的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Go程序性能优化及pprof使用方法详解

    Go程序性能优化及pprof使用方法详解

    这篇文章主要为大家详细介绍了Go程序性能优化及pprof的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • golang 熔断限流降级实践

    golang 熔断限流降级实践

    本文主要介绍了golang 熔断限流降级实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • 如何使用腾讯云go sdk 查询对象存储中最新文件

    如何使用腾讯云go sdk 查询对象存储中最新文件

    这篇文章主要介绍了使用腾讯云go sdk 查询对象存储中最新文件,这包括如何创建COS客户端,如何逐页检索对象列表,并如何对结果排序以找到最后更新的对象,我们还展示了如何优化用户体验,通过实时进度更新和检索多个文件来改进程序,需要的朋友可以参考下
    2024-03-03
  • Golang中实现数据脱敏处理的go-mask包分享

    Golang中实现数据脱敏处理的go-mask包分享

    这篇文章主要是来和大家分享一个在输出中对敏感数据进行脱敏的工作包:go-mask,可以将敏感信息输出的时候替换成星号或其他字符,感兴趣的小编可以跟随小编一起了解下
    2023-05-05

最新评论