現在的通義靈碼不但全面支持 Qwen3,還支持配置自己的 MCP 工具,還沒體驗過的小伙伴,馬上配置起來啦~?

?https://click.aliyun.com/m/1000403618/

在 Go 語言開發領域,json 數據處理是極為常見的任務。Go 標準庫提供了?encoding/json?包用于處理 json 數據,同時第三方庫 GJSON & SJSON 也在 json 處理方面表現出色。

本文將深入探討下 GJSON 組件,通過與原生處理方式對比,它存在什么特別之處,它的優勢體現在哪。

一、Go 原生 json 讀取方式

Go 原生讀取 json 數據,通常需先定義結構體,然后再將 json 數據解析到結構體實例,如:

{"name": "張三","age": 25
}
  • 1.
  • 2.
  • 3.
  • 4.

具體處理邏輯:

package mainimport ("encoding/json""fmt"
)type Person struct {Name string `json:"name"`Age  int    `json:"age"`
}func main() {jsonStr := `{"name":"張三","age":25}`var person Personerr := json.Unmarshal([]byte(jsonStr), &person)if err!= nil {fmt.Println("解析錯誤:", err)return}fmt.Println("Name:", person.Name)fmt.Println("Age:", person.Age)
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.

這種方式雖能準確解析 json 數據,但如果 json 存在多層嵌套,層級過度包裝,那么結構體定義以及解析過程就會變得相當繁瑣。

二、GJSON 組件

1. 概述:

GJSON 是一個輕量級且高性能的 JSON 解析庫,它允許開發者通過簡潔的語法,無需定義結構體,就能快速提取 JSON 數據中的特定值。

官網地址:?GitHub - tidwall/gjson

2. 安裝:

使用 Go 的包管理工具?go get?安裝 GJSON:

go get -u github.com/tidwall/gjson
  • 1.

三、GJSON 基本用法

1. 簡單 json 數據獲取

對于簡單的 json,像前面那個例子,直接用?gjson.Get?方法,傳入 json 字符串和要獲取的字段名,就能拿到對應的值。比如獲取?name?字段,gjson.Get(jsonStr, "name")?就可以搞定,例如:

package mainimport ("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())
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

2. 嵌套 json 數據獲取

上述提到,原生的處理方式對于多層級的 json 很不友好,然而 gjon 可以直接通過點號分隔路徑定位數據,這時候它的優勢就逐漸明顯,例如:

{"name": "張三","age": 25,"hobby": {"sing": "只因你太美","dance": "背帶褲","rap": "kun","ball": "籃球"}
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

具體處理邏輯:

package mainimport ("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())
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

相比原生方式,無需復雜結構體定義,操作更簡便。

3. json 數組讀取

如果在 json 中嵌套了數組,對于這種的處理也比較簡單,直接通過數組下標來定位數據即可,如:

package mainimport ("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())
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

相比于原生方式處理數組,得先解析成切片,操作起來就沒這么直接。

四、GJSON 與原生 JSON 處理方式對比

  • GJSON 語法簡單直觀,熟悉 json 結構即可快速上手,無需學習結構體定義及標簽使用等知識。而原生方式在結構體定義上相對復雜,尤其是處理復雜 json 結構時。
  • GJSON 無需將整個 json 數據解析為結構體,在處理大型 json 數據時,內存占用少,解析速度快。原生方式在解析復雜 json 數據時,結構體構建和內存分配開銷較大。
  • GJSON 對各種復雜 json 結構都能靈活應對,根據需求按路徑獲取數據,無需頻繁修改代碼結構。原生方式則需根據 json 結構變化,頻繁修改結構體定義,靈活性較差。