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数组字符串的资料请关注脚本之家其它相关文章!

相关文章

  • Go Sentinel 动态数据源配置指南(示例详解)

    Go Sentinel 动态数据源配置指南(示例详解)

    本文介绍了如何使用Go语言配置Sentinel的动态数据源,并通过本地文件和Nacos两种方式实现动态配置,通过这种方式,可以灵活地管理和更新限流规则,提升系统的稳定性和响应速度,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • Golang实现为图片添加水印和文字的示例代码

    Golang实现为图片添加水印和文字的示例代码

    在现代数字化和社交媒体的时代,图片处理已经成为了一项重要的技能,在本文中,我们将探讨使用Golang进行图片添加水印和文字,感兴趣的小伙伴可以了解下
    2026-02-02
  • golang实现aes-cbc-256加密解密功能

    golang实现aes-cbc-256加密解密功能

    这篇文章主要介绍了golang实现aes-cbc-256加密解密功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • golang实现ping命令的完整代码

    golang实现ping命令的完整代码

    这篇文章给大家介绍了如何使用golang实现ping命令,文中给大家介绍了完整的实现代码,并有详细的图文讲解,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • GoFrame gredis缓存DoVar及Conn连接对象的自动序列化

    GoFrame gredis缓存DoVar及Conn连接对象的自动序列化

    这篇文章主要为大家介绍了GoFrame gredis干货DoVar Conn连接对象自动序列化详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 一文带你深入探究Go语言中的sync.Map

    一文带你深入探究Go语言中的sync.Map

    在 Go 语言中,有一个非常实用的并发安全的 Map 实现:sync.Map,它是在 Go 1.9 版本中引入的。本文我们将深入探讨 sync.Map 的基本原理,帮助读者更好地理解并使用这个并发安全的 Map
    2023-04-04
  • Golang Gorm 更新字段save、update、updates

    Golang Gorm 更新字段save、update、updates

    在gorm中,批量更新操作可以通过使用Update方法来实现,本文主要介绍了Golang Gorm 更新字段save、update、updates,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • 详解go语言中并发安全和锁问题

    详解go语言中并发安全和锁问题

    这篇文章主要介绍了go语言中并发安全和锁问题,包含互斥锁解锁过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • Go处理json数据方法详解(Marshal,UnMarshal)

    Go处理json数据方法详解(Marshal,UnMarshal)

    这篇文章主要介绍了Go处理json数据的方法详解,Marshal(),UnMarshal(),需要的朋友可以参考下
    2022-04-04
  • golang标准库crc32的使用样例

    golang标准库crc32的使用样例

    根据实验我们知道crc32算法比md5算法快4倍左右,所以研究了下golang的crc32使用,这篇文章主要给大家介绍了关于golang标准库crc32使用的相关资料,需要的朋友可以参考下
    2024-03-03

最新评论