Golang一日一庫之gjson

始識發表於2024-04-21

官網

https://github.com/tidwall/gjson

一 簡介

gjson實際上是get + json的縮寫,用於讀取 JSON 串

二 使用

1.安裝

go get github.com/tidwall/gjson

2.使用

package main

import (
  "fmt"

  "github.com/tidwall/gjson"
)

func main() {
  json := `{"name":{"first":"li","last":"dj"},"age":18}`
  lastName := gjson.Get(json, "name.last")
  fmt.Println("last name:", lastName.String())

  age := gjson.Get(json, "age")
  fmt.Println("age:", age.Int())
}

只需要傳入 JSON 串和要讀取的鍵路徑即可。注意一點細節,因為gjson.Get()函式實際上返回的是gjson.Result型別,我們要呼叫其相應的方法進行轉換對應的型別。如上面的String()和Int()方法。
如果是直接列印輸出,其實可以省略String(),fmt包的大部分函式都可以對實現fmt.Stringer介面的型別呼叫String()方法。

3. 遍歷

gjson.Get()方法返回一個gjson.Result型別的物件,json.Result提供了ForEach()方法用於遍歷。該方法接受一個型別為func (key, value gjson.Result) bool的回撥函式。遍歷物件時key和value分別為物件的鍵和值;遍歷陣列時,value為陣列元素,key為空(不是索引)。回撥返回false時,遍歷停止。

const json = `
{
  "name":"dj",
  "age":18,
  "pets": ["cat", "dog"],
  "contact": {
    "phone": "123456789",
    "email": "dj@example.com"
  }
}`

func main() {
  pets := gjson.Get(json, "pets")
  pets.ForEach(func(_, pet gjson.Result) bool {
    fmt.Println(pet)
    return true
  })

  contact := gjson.Get(json, "contact")
  contact.ForEach(func(key, value gjson.Result) bool {
    fmt.Println(key, value)
    return true
  })
}


4.一次性獲得多個值

呼叫gjson.Get()一次只能讀取一個值,多次呼叫又比較麻煩,gjson提供了GetMany()可以一次讀取多個值,返回一個陣列[]gjson.Result。

const json = `
{
  "name":"dj",
  "age":18,
  "pets": ["cat", "dog"],
  "contact": {
    "phone": "123456789",
    "email": "dj@example.com"
  }
}`

func main() {
  results := gjson.GetMany(json, "name", "age", "pets.#", "contact.phone")
  for _, result := range results {
    fmt.Println(result)
  }
}

相關文章