欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go利用GJSON組件解鎖JSON讀取新姿勢

 更新時間:2025年03月25日 10:46:05   作者:Vespeng  
Go 標(biāo)準(zhǔn)庫提供了 encoding/json 包用于處理 json 數(shù)據(jù),同時第三方庫 GJSON & SJSON 也在 json 處理方面表現(xiàn)出色,下面我們就來看看如何使用GJSON解鎖JSON讀取新方法吧

在 Go 語言開發(fā)領(lǐng)域,json 數(shù)據(jù)處理是極為常見的任務(wù)。Go 標(biāo)準(zhǔn)庫提供了 encoding/json 包用于處理 json 數(shù)據(jù),同時第三方庫 GJSON & SJSON 也在 json 處理方面表現(xiàn)出色。

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

一、Go 原生 json 讀取方式

Go 原生讀取 json 數(shù)據(jù),通常需先定義結(jié)構(gòu)體,然后再將 json 數(shù)據(jù)解析到結(jié)構(gòu)體實(shí)例,如:

{
    "name": "張三",
    "age": 25
}

具體處理邏輯:

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    jsonStr := `{"name":"張三","age":25}`

    var person Person
    err := json.Unmarshal([]byte(jsonStr), &person)
    if err!= nil {
        fmt.Println("解析錯誤:", err)
        return
    }

    fmt.Println("Name:", person.Name)
    fmt.Println("Age:", person.Age)
}

這種方式雖能準(zhǔn)確解析 json 數(shù)據(jù),但如果 json 存在多層嵌套,層級過度包裝,那么結(jié)構(gòu)體定義以及解析過程就會變得相當(dāng)繁瑣。

二、GJSON 組件

1、概述

GJSON 是一個輕量級且高性能的 JSON 解析庫,它允許開發(fā)者通過簡潔的語法,無需定義結(jié)構(gòu)體,就能快速提取 JSON 數(shù)據(jù)中的特定值。

官網(wǎng)地址:GitHub - tidwall/gjson

2、安裝

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

go get -u github.com/tidwall/gjson

三、GJSON 基本用法

1、簡單 json 數(shù)據(jù)獲取

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

package main

import (
    "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())
}

2、嵌套 json 數(shù)據(jù)獲取

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

{
    "name": "張三",
    "age": 25,
    "hobby": {
        "sing": "只因你太美",
        "dance": "背帶褲",
        "rap": "kun",
        "ball": "籃球"
    }
}

具體處理邏輯:

package main

import (
    "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())
}

相比原生方式,無需復(fù)雜結(jié)構(gòu)體定義,操作更簡便。

3、json 數(shù)組處理

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

package main

import (
    "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())
}

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

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

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

到此這篇關(guān)于Go利用GJSON組件解鎖JSON讀取新姿勢的文章就介紹到這了,更多相關(guān)Go GJSON讀取JSON內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang 中string和int類型相互轉(zhuǎn)換

    golang 中string和int類型相互轉(zhuǎn)換

    這篇文章主要介紹了golang 中string和int類型相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • GO語言中通道和sync包的使用教程分享

    GO語言中通道和sync包的使用教程分享

    這篇文章主要為大家詳細(xì)介紹了Go語言中通道和sync包的相關(guān)資料,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定的幫助,需要的可以參考一下
    2023-02-02
  • Go語言Select chan用法小結(jié)

    Go語言Select chan用法小結(jié)

    select語句是Go語言中用于處理多個通道操作的關(guān)鍵字,它允許你在多個通道上進(jìn)行非阻塞的選擇操作,本文就詳細(xì)介紹一下如何使用,感興趣的可以了解一下
    2023-09-09
  • go語言中iota和左移右移的使用說明

    go語言中iota和左移右移的使用說明

    這篇文章主要介紹了go語言中iota和左移右移的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • 詳解Golang中字符串的使用

    詳解Golang中字符串的使用

    這篇文章主要為大家詳細(xì)介紹了Golang中字符串的使用,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Golang有一定的幫助,感興趣的小伙伴可以了解一下
    2022-10-10
  • Golang程序如何查找內(nèi)存泄漏(pprof)

    Golang程序如何查找內(nèi)存泄漏(pprof)

    該文章詳細(xì)介紹了如何使用Golang的pprof工具查找內(nèi)存泄漏,首先,在main包中引入pprof包并設(shè)置條件編譯,然后編譯程序并運(yùn)行,通過執(zhí)行g(shù)otoolpprof-inuse_space命令,可以進(jìn)入交互模式并使用top命令查看內(nèi)存分配最多的函數(shù),如果本機(jī)中有源代碼
    2024-12-12
  • Go實(shí)現(xiàn)共享庫的方法

    Go實(shí)現(xiàn)共享庫的方法

    本文主要介紹了Go實(shí)現(xiàn)共享庫的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 基于Go和PHP語言實(shí)現(xiàn)爬樓梯算法的思路詳解

    基于Go和PHP語言實(shí)現(xiàn)爬樓梯算法的思路詳解

    這篇文章主要介紹了Go和PHP 實(shí)現(xiàn)爬樓梯算法,本文通過動態(tài)規(guī)劃和斐波那契數(shù)列兩種解決思路給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Go語言實(shí)現(xiàn)權(quán)重抽獎系統(tǒng)的項(xiàng)目實(shí)踐

    Go語言實(shí)現(xiàn)權(quán)重抽獎系統(tǒng)的項(xiàng)目實(shí)踐

    本文主要介紹了Go語言實(shí)現(xiàn)權(quán)重抽獎系統(tǒng)的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • GIN的路由以及傳參問題

    GIN的路由以及傳參問題

    本文主要介紹了GIN的路由以及傳參問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評論