Go利用GJSON組件解鎖JSON讀取新姿勢
在 Go 語言開發(fā)領(lǐng)域,json 數(shù)據(jù)處理是極為常見的任務(wù)。Go 標(biāo)準(zhǔn)庫提供了 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)體實(shí)例,如:
{ "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) }
這種方式雖能準(zhǔn)確解析 json 數(shù)據(jù),但如果 json 存在多層嵌套,層級過度包裝,那么結(jié)構(gòu)體定義以及解析過程就會變得相當(dāng)繁瑣。
二、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 字符串和要獲取的字段名,就能拿到對應(yīng)的值。比如獲取 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 可以直接通過點(diǎn)號分隔路徑定位數(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()) }
相比原生方式,無需復(fù)雜結(jié)構(gòu)體定義,操作更簡便。
3、json 數(shù)組處理
如果在 json 中嵌套了數(shù)組,對于這種的處理也比較簡單,直接通過數(shù)組下標(biāo)來定位數(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)即可快速上手,無需學(xué)習(xí)結(jié)構(gòu)體定義及標(biāo)簽使用等知識。而原生方式在結(jié)構(gòu)體定義上相對復(fù)雜,尤其是處理復(fù)雜 json 結(jié)構(gòu)時。
- GJSON 無需將整個 json 數(shù)據(jù)解析為結(jié)構(gòu)體,在處理大型 json 數(shù)據(jù)時,內(nèi)存占用少,解析速度快。原生方式在解析復(fù)雜 json 數(shù)據(jù)時,結(jié)構(gòu)體構(gòu)建和內(nèi)存分配開銷較大。
- GJSON 對各種復(fù)雜 json 結(jié)構(gòu)都能靈活應(yīng)對,根據(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)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02基于Go和PHP語言實(shí)現(xiàn)爬樓梯算法的思路詳解
這篇文章主要介紹了Go和PHP 實(shí)現(xiàn)爬樓梯算法,本文通過動態(tài)規(guī)劃和斐波那契數(shù)列兩種解決思路給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05Go語言實(shí)現(xiàn)權(quán)重抽獎系統(tǒng)的項(xiàng)目實(shí)踐
本文主要介紹了Go語言實(shí)現(xiàn)權(quán)重抽獎系統(tǒng)的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04