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. 性能對比和使用場景
性能排序(通常):
- fastjson - 最快,但API較復(fù)雜
- json-iterator/go - 性能很好,API兼容標(biāo)準(zhǔn)庫
- go-json - 性能優(yōu)秀,API完全兼容標(biāo)準(zhǔn)庫
- gjson - 查詢性能優(yōu)秀,適合部分讀取
- 標(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實(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
Golang中實(shí)現(xiàn)數(shù)據(jù)脫敏處理的go-mask包分享
這篇文章主要是來和大家分享一個(gè)在輸出中對敏感數(shù)據(jù)進(jìn)行脫敏的工作包:go-mask,可以將敏感信息輸出的時(shí)候替換成星號或其他字符,感興趣的小編可以跟隨小編一起了解下2023-05-05

