欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go處理JSON數(shù)組字符串的常用第三方庫代碼示例

 更新時(shí)間:2025年09月19日 09:14:33   作者:學(xué)亮編程手記  
在Go語言中,處理JSON數(shù)組是一項(xiàng)常見的任務(wù),JSON(JavaScript Object Notation)是一種常用的數(shù)據(jù)交換格式,而數(shù)組是其中一種重要的數(shù)據(jù)結(jié)構(gòu),本文將介紹如何使用Go語言處理JSON數(shù)組字符串,并提供相應(yīng)的源代碼和描述,需要的朋友可以參考下

對于 JSON 數(shù)組字符串的處理,Go 提供了多種方式。同時(shí)也有一些高效的第三方庫可供選擇。

1. 使用標(biāo)準(zhǔn)庫處理 JSON 數(shù)組

基本數(shù)組處理

package main

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

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

func main() {
    // JSON 數(shù)組字符串
    jsonArrayStr := `[
        {"name":"張三","age":25},
        {"name":"李四","age":30},
        {"name":"王五","age":28}
    ]`

    // 方法1: 解析到結(jié)構(gòu)體切片
    var users []User
    err := json.Unmarshal([]byte(jsonArrayStr), &users)
    if err != nil {
        log.Fatal("JSON 解析錯(cuò)誤:", 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 解析錯(cuò)誤:", err)
    }

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

流式處理大數(shù)組

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

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

    // 讀取開始數(shù)組標(biāo)記
    token, err := decoder.Token()
    if err != nil || token != json.Delim('[') {
        log.Fatal("不是有效的 JSON 數(shù)組")
    }

    // 逐個(gè)解碼數(shù)組元素
    for decoder.More() {
        var user User
        if err := decoder.Decode(&user); err != nil {
            log.Fatal("解碼錯(cuò)誤:", 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 解析錯(cuò)誤:", err)
    }
    
    fmt.Println("json-iterator 解析結(jié)果:", 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())

    // 獲取第一個(gè)用戶的年齡
    age := gjson.Get(jsonArrayStr, "0.age")
    fmt.Println("第一個(gè)用戶年齡:", 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("解析錯(cuò)誤:", err)
    }

    array, err := v.Array()
    if err != nil {
        log.Fatal("不是數(shù)組:", err)
    }

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

2.4 go-json - 替代標(biāo)準(zhǔn)庫的高性能實(shí)現(xiàn)

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 解析錯(cuò)誤:", err)
    }
    
    fmt.Println("go-json 解析結(jié)果:", users)
}

3. 性能對比和使用場景

性能排序(通常):

  1. fastjson - 最快,但API較復(fù)雜
  2. json-iterator/go - 性能很好,API兼容標(biāo)準(zhǔn)庫
  3. go-json - 性能優(yōu)秀,API完全兼容標(biāo)準(zhǔn)庫
  4. gjson - 查詢性能優(yōu)秀,適合部分讀取
  5. 標(biāo)準(zhǔn)庫 - 穩(wěn)定但相對較慢

推薦使用場景:

  • 需要極致性能:fastjson 或 json-iterator
  • 兼容性和性能平衡:json-iterator 或 go-json
  • 只需要查詢部分字段:gjson
  • 生產(chǎn)環(huán)境穩(wěn)定性:標(biāo)準(zhǔn)庫或 json-iterator

4. 基準(zhǔn)測試示例

func benchmarkJSONLibraries() {
    // 生成測試數(shù)據(jù)
    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)
    
    // 可以在這里添加各個(gè)庫的性能測試代碼
    fmt.Printf("測試數(shù)據(jù)大小: %d bytes\n", len(jsonStr))
}

選擇哪個(gè)庫取決于你的具體需求:如果需要最好的性能,推薦 json-iterator 或 fastjson;如果需要簡單的查詢功能,gjson 是不錯(cuò)的選擇。

以上就是Go處理JSON數(shù)組字符串的常用第三方庫代碼示例的詳細(xì)內(nèi)容,更多關(guān)于Go處理JSON數(shù)組字符串的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 聊聊golang的defer的使用

    聊聊golang的defer的使用

    這篇文章主要介紹了聊聊golang的defer的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • go語言beego框架分頁器操作及接口頻率限制示例

    go語言beego框架分頁器操作及接口頻率限制示例

    這篇文章主要為大家介紹了go語言beego框架分頁器操作使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Golang中http包的具體使用

    Golang中http包的具體使用

    Go語言內(nèi)置的net/http包十分優(yōu)秀,提供了http客戶端和服務(wù)器的實(shí)現(xiàn),本文主要介紹了Golang中http包的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • 使用Go語言進(jìn)行條件編譯的示例代碼

    使用Go語言進(jìn)行條件編譯的示例代碼

    Go的條件編譯主要通過構(gòu)建標(biāo)簽(build?tags)和構(gòu)建約束(build?constraints)來實(shí)現(xiàn),這些標(biāo)簽和約束可以讓我們針對不同的操作系統(tǒng)、架構(gòu)或特定條件編寫特定代碼,本文給大家介紹了如何使用Go語言進(jìn)行條件編譯,需要的朋友可以參考下
    2024-06-06
  • Golang實(shí)現(xiàn)讀取ZIP壓縮包并顯示Gin靜態(tài)html網(wǎng)站

    Golang實(shí)現(xiàn)讀取ZIP壓縮包并顯示Gin靜態(tài)html網(wǎng)站

    這篇文章主要為大家詳細(xì)介紹了如何通過Golang實(shí)現(xiàn)從ZIP壓縮包讀取內(nèi)容并作為Gin靜態(tài)網(wǎng)站顯示,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-07-07
  • go等待一組協(xié)程結(jié)束的操作方式

    go等待一組協(xié)程結(jié)束的操作方式

    這篇文章主要介紹了go等待一組協(xié)程結(jié)束的操作方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go程序性能優(yōu)化及pprof使用方法詳解

    Go程序性能優(yōu)化及pprof使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Go程序性能優(yōu)化及pprof的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • golang 熔斷限流降級實(shí)踐

    golang 熔斷限流降級實(shí)踐

    本文主要介紹了golang 熔斷限流降級實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • 如何使用騰訊云go sdk 查詢對象存儲中最新文件

    如何使用騰訊云go sdk 查詢對象存儲中最新文件

    這篇文章主要介紹了使用騰訊云go sdk 查詢對象存儲中最新文件,這包括如何創(chuàng)建COS客戶端,如何逐頁檢索對象列表,并如何對結(jié)果排序以找到最后更新的對象,我們還展示了如何優(yōu)化用戶體驗(yàn),通過實(shí)時(shí)進(jìn)度更新和檢索多個(gè)文件來改進(jìn)程序,需要的朋友可以參考下
    2024-03-03
  • Golang中實(shí)現(xiàn)數(shù)據(jù)脫敏處理的go-mask包分享

    Golang中實(shí)現(xiàn)數(shù)據(jù)脫敏處理的go-mask包分享

    這篇文章主要是來和大家分享一個(gè)在輸出中對敏感數(shù)據(jù)進(jìn)行脫敏的工作包:go-mask,可以將敏感信息輸出的時(shí)候替換成星號或其他字符,感興趣的小編可以跟隨小編一起了解下
    2023-05-05

最新評論