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 字符串爲例
還有一些路徑通配符,比如你有模糊查詢或者想在 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 數據的必備良品,如果涉及到多人開發,需要用到同樣的接口結構體,我建議還是老老實實的寫結構體,畢竟數據模型的搭建是多人協同開發基礎之一。