讓 json 解析更簡單高效的 GJSON
Golang | Gjson 庫
簡介 什麼是 Gjson:
GJSON 是一個 Golang 包,它提供了一種快速,簡單的方法來從 json 格式文件中獲取值。它擁有比如單行檢索,用"."符號來尋找路徑,迭代和解析多行 json 的功能。
個人理解
Gjson實際上就是一個比原生 json 解析更快更簡單的一種工具,對於 API 來說,我不關心這個 json 格式是否有錯,我只需要關心這個 json 裡面有沒有我想要的資料,快速格式化成我想要的格式。
安裝
GO MOD 模式下,執行:
$ go get -u github.com/tidwall/gjson
直接獲取值
我還是會由淺入深的給大家介紹這個庫的使用方法,如果我們拿到了一個 json 字串的時候應該這樣做:
package main
import (
"fmt"
"github.com/tidwall/gjson"
)
func main() {
exampleJsonString := `{
"code":"000",
"data":{
"all_count":441353,
"lists":[
{
"id":441353,
"job_name":"經營日報-同步職位資訊",
"job_recall_time":"2021-03-13 15:05:04",
"job_recall_content":"請求成功:great",
"create_time":"2021-03-13 15:05:04"
},
{
"id":441352,
"job_name":"經營日報-Check張繼學列表",
"job_recall_time":"2021-03-13 15:05:00",
"job_recall_content":"請求成功:OK",
"create_time":"2021-03-13 15:05:00"
}
]
},
"msg":"獲取列表成功",
"success":true
}`
jsonCode := gjson.Get(exampleJsonString, "code") //這個後面你可以繼續跟想要的結果型別,不加的話會是json字串的型別
fmt.Println(jsonCode) // 結果 000
jsonOneJobName := gjson.Get(exampleJsonString,"data.lists.#.job_name").Array() //比如我這裡就希望返回是一個切片型別
fmt.Println(jsonOneJobName) // 結果 [經營日報-同步職位資訊 經營日報-Check張繼學列表]
}
上面的同學開始疑問了,如果我自己寫錯了怎麼辦,或者沒有那個 key 欄位怎麼辦,沒關係,你在獲取到了後,加上自己想要的判斷型別,再判斷一次是否為空即可。
我都不需要定義任何結構體,用最簡單的辦法獲取到我想要的內容
路徑語法的快速概述:
路徑語法的快速概述,以上面 json 字串為例
路徑 | 結果 | 解釋 |
---|---|---|
data.lists.# | 2 | 獲取當前 json 陣列的長度 |
data.lists.1.job_name | 經營日報-Check 張繼學列表 | 獲取 data 下 lists 的索引為 1 的 job_name 值 |
data.lists.#.job_name | [經營日報 - 同步職位資訊 經營日報-Check 張繼學列表] | 獲取 data 下 lists 下所有的 job_name 值 |
還有一些路徑萬用字元,比如你有模糊查詢或者想在 json 取值時有判斷的需求,可檢視官方文件:https://github.com/tidwall/gjson
返回函式
列舉一些常用的返回函式使用
package main
// ...
// ...
fmt.Println(gjson.Get(exampleJsonString,"data.lists.1.create_time").Exists()) // 檢視當前路徑的值是否存在 結果 true
fmt.Println(gjson.Get(exampleJsonString,"data.lists").IsArray()) //檢視當前路徑是否是json陣列 結果 true
fmt.Println(gjson.Get(exampleJsonString,"data.lists.0").IsObject()) //檢視當前路徑是否是一個json物件 結果 true
gjson.Get(exampleJsonString,"data.lists.1").ForEach(func(key, value gjson.Result) bool {
fmt.Println(value)
return true
})
//獲取到路徑結果後,遍歷取值(其實覺得自己遍歷可讀性更高)
fmt.Println(gjson.Get(exampleJsonString,"data.lists.1.id").Float()) //所有標準型別都可以獲取到,比如 Bool,Int,Value(這個是介面型別),Unit,String
直接解析 bytes 型別
實際上,很多時候我們拿到的 JSON 資料都是從 API 中獲得,比如從 http 請求中獲得了 body,之後 ioutil.ReadAll 獲得了 [] byte 型別的資料
package main
import (
"fmt"
"github.com/tidwall/gjson"
)
func main() {
exampleJsonByte := []byte(`{
"code":"000",
"data":{
"all_count":441353,
"lists":[
{
"id":441353,
"job_name":"經營日報-同步職位資訊",
"job_recall_time":"2021-03-13 15:05:04",
"job_recall_content":"請求成功:great",
"create_time":"2021-03-13 15:05:04"
},
{
"id":441352,
"job_name":"經營日報-Check張繼學列表",
"job_recall_time":"2021-03-13 15:05:00",
"job_recall_content":"請求成功:OK",
"create_time":"2021-03-13 15:05:00"
}
]
},
"msg":"獲取列表成功",
"success":true
}`)
fmt.Println(gjson.GetBytes(exampleJsonByte, "data.lists.#.job_name").Array()) //好吧,結果一樣 [經營日報-同步職位資訊 經營日報-Check張繼學列表]
}
總結
GJSON 真的太簡單了,可以說是小白 golang 解析 json 資料的必備良品,如果涉及到多人開發,需要用到同樣的介面結構體,我建議還是老老實實的寫結構體,畢竟資料模型的搭建是多人協同開發基礎之一。
還想了解更多嗎?
更多請檢視:https://github.com/tidwall/gjson
歡迎加入我們 GOLANG 中國社群:https://gocn.vip/
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- go語言Json解析實用工具 - gjsonGoJSON
- 關於GJSON包的簡單使用JSON
- 高效規範的 圖紙管理解決方案,讓圖紙文件管理更簡單
- 嘗試讓查詢更簡單
- 讓json更懂中文JSON
- Goravel V1 正式版釋出,讓 Go 開發更簡單、高效!Go
- C++寫一個簡單的JSON解析C++JSON
- Coding Monthly | 讓開發更簡單!
- 瞭解CSS的查詢匹配原理,讓CSS更簡潔、高效CSS
- go-mongox:簡單高效,讓文件操作和 bson 資料構造更流暢Go
- QSpace Pro 4 多皮膚檔案管理器,讓你的工作更簡單、更高效
- Bartender 4: 讓你的 Mac 選單欄更整潔更高效Mac
- 讓動畫實現更簡單,Flutter 動畫簡易教程!動畫Flutter
- jquery解析json格式字串簡單介紹jQueryJSON字串
- CSS 文件流技巧,讓佈局更簡單CSS
- 讓服務呼叫更簡單 - Caller.HttpClientHTTPclient
- Flyway讓資料庫版本管理更簡單資料庫
- 使用原生 cookieStore 方法,讓 Cookie 操作更簡單Cookie
- Serverless + AI 讓應用開發更簡單ServerAI
- 當 dbt 遇見 TiDB丨高效的資料轉換工具讓資料分析更簡單TiDB
- KubeVela 1.4:讓應用交付更安全、上手更簡單、過程更透明
- 換種思路寫Mock,讓單元測試更簡單Mock
- Media Encoder 2024:高效穩定,讓媒體編碼更簡單 mac/win版Mac
- 安全高效,一鍵搞定:Ftrans檔案擺渡系統讓資料流轉更簡單!
- 【uni-app必備】uView UI框架,多端開發神器,讓開發更簡單、更高效!APPViewUI框架
- iOS好用的分類工具 讓開發更簡單 WHKitiOS
- Smartour——讓網頁導覽變得更簡單網頁
- 讓動畫變得更簡單之FLIP技術動畫
- Alfred配合翻譯功能, 讓英語更簡單Alfred
- 免費API介面:讓開發更簡單更快API
- WPF自定義Panel:讓拖拽變得更簡單
- 將物件解析為JSON資料和將JSON資料解析為物件的簡單例項物件JSON單例
- 高效的 Json 解析框架 kotlinx.serializationJSON框架Kotlin
- 學會 CSS 文件流技巧,讓佈局更簡單CSS
- seldom 2.0 讓介面自動化測試更簡單
- [翻譯]Kafka Streams簡介: 讓流處理變得更簡單Kafka
- Media Encoder 2024:高效穩定,讓媒體編碼更簡單 mac/win啟用版Mac
- 簡單易懂的JSON框架JSON框架