Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go处理JSON数组字符串

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

作者:学亮编程手记

在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. 标准库 - 稳定但相对较慢

推荐使用场景:

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

您可能感兴趣的文章:
阅读全文