Go利用GJSON組件解鎖JSON讀取新姿勢
在 Go 語言開發(fā)領(lǐng)域,json 數(shù)據(jù)處理是極為常見的任務。Go 標準庫提供了 encoding/json 包用于處理 json 數(shù)據(jù),同時第三方庫 GJSON & SJSON 也在 json 處理方面表現(xiàn)出色。
本文將深入探討下 GJSON 組件,通過與原生處理方式對比,它存在什么特別之處,它的優(yōu)勢體現(xiàn)在哪。
一、Go 原生 json 讀取方式
Go 原生讀取 json 數(shù)據(jù),通常需先定義結(jié)構(gòu)體,然后再將 json 數(shù)據(jù)解析到結(jié)構(gòu)體實例,如:
{
"name": "張三",
"age": 25
}
具體處理邏輯:
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
jsonStr := `{"name":"張三","age":25}`
var person Person
err := json.Unmarshal([]byte(jsonStr), &person)
if err!= nil {
fmt.Println("解析錯誤:", err)
return
}
fmt.Println("Name:", person.Name)
fmt.Println("Age:", person.Age)
}
這種方式雖能準確解析 json 數(shù)據(jù),但如果 json 存在多層嵌套,層級過度包裝,那么結(jié)構(gòu)體定義以及解析過程就會變得相當繁瑣。
二、GJSON 組件
1、概述
GJSON 是一個輕量級且高性能的 JSON 解析庫,它允許開發(fā)者通過簡潔的語法,無需定義結(jié)構(gòu)體,就能快速提取 JSON 數(shù)據(jù)中的特定值。
官網(wǎng)地址:GitHub - tidwall/gjson
2、安裝
使用 Go 的包管理工具 go get 安裝 GJSON:
go get -u github.com/tidwall/gjson
三、GJSON 基本用法
1、簡單 json 數(shù)據(jù)獲取
對于簡單的 json,像前面那個例子,直接用 gjson.Get 方法,傳入 json 字符串和要獲取的字段名,就能拿到對應的值。比如獲取 name 字段,gjson.Get(jsonStr, "name") 就可以搞定,例如:
package main
import (
"fmt"
"github.com/tidwall/gjson"
)
func main() {
jsonStr := `{"name":"張三","age":25}`
name := gjson.Get(jsonStr, "name")
age := gjson.Get(jsonStr, "age")
fmt.Println("Name:", name.String())
fmt.Println("Age:", age.Int())
}
2、嵌套 json 數(shù)據(jù)獲取
上述提到,原生的處理方式對于多層級的 json 很不友好,然而 gjon 可以直接通過點號分隔路徑定位數(shù)據(jù),這時候它的優(yōu)勢就逐漸明顯,例如:
{
"name": "張三",
"age": 25,
"hobby": {
"sing": "只因你太美",
"dance": "背帶褲",
"rap": "kun",
"ball": "籃球"
}
}
具體處理邏輯:
package main
import (
"fmt"
"github.com/tidwall/gjson"
)
func main() {
jsonStr := `{
"name": "張三",
"age": 25,
"hobby": {
"sing": "只因你太美",
"dance": "背帶褲",
"rap": "kun",
"ball": "籃球"
}`
name := gjson.Get(jsonStr, "name")
ball := gjson.Get(jsonStr, "hobby.ball")
fmt.Println("Name:", name.String())
fmt.Println("ball:", ball.String())
}
相比原生方式,無需復雜結(jié)構(gòu)體定義,操作更簡便。
3、json 數(shù)組處理
如果在 json 中嵌套了數(shù)組,對于這種的處理也比較簡單,直接通過數(shù)組下標來定位數(shù)據(jù)即可,如:
package main
import (
"fmt"
"github.com/tidwall/gjson"
)
func main() {
jsonStr := `{"hobby": ["sing","dance","rap","ball"]}`
hobby := gjson.Get(jsonStr, "hobby.3")
// 輸出第4個愛好
fmt.Println("hobby:", hobby.String())
}
相比于原生方式處理數(shù)組,得先解析成切片,操作起來就沒這么直接。
四、GJSON 與原生 JSON 處理方式對比
- GJSON 語法簡單直觀,熟悉 json 結(jié)構(gòu)即可快速上手,無需學習結(jié)構(gòu)體定義及標簽使用等知識。而原生方式在結(jié)構(gòu)體定義上相對復雜,尤其是處理復雜 json 結(jié)構(gòu)時。
- GJSON 無需將整個 json 數(shù)據(jù)解析為結(jié)構(gòu)體,在處理大型 json 數(shù)據(jù)時,內(nèi)存占用少,解析速度快。原生方式在解析復雜 json 數(shù)據(jù)時,結(jié)構(gòu)體構(gòu)建和內(nèi)存分配開銷較大。
- GJSON 對各種復雜 json 結(jié)構(gòu)都能靈活應對,根據(jù)需求按路徑獲取數(shù)據(jù),無需頻繁修改代碼結(jié)構(gòu)。原生方式則需根據(jù) json 結(jié)構(gòu)變化,頻繁修改結(jié)構(gòu)體定義,靈活性較差。
到此這篇關(guān)于Go利用GJSON組件解鎖JSON讀取新姿勢的文章就介紹到這了,更多相關(guān)Go GJSON讀取JSON內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang 中string和int類型相互轉(zhuǎn)換
這篇文章主要介紹了golang 中string和int類型相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
Go語言實現(xiàn)權(quán)重抽獎系統(tǒng)的項目實踐
本文主要介紹了Go語言實現(xiàn)權(quán)重抽獎系統(tǒng)的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-04-04

