GJSON的使用

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 數據的必備良品,如果涉及到多人開發,需要用到同樣的接口結構體,我建議還是老老實實的寫結構體,畢竟數據模型的搭建是多人協同開發基礎之一。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章