最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go利用GJSON組件解鎖JSON讀取新姿勢(shì)

 更新時(shí)間:2025年03月25日 10:46:05   作者:Vespeng  
Go 標(biāo)準(zhǔn)庫提供了 encoding/json 包用于處理 json 數(shù)據(jù),同時(shí)第三方庫 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ù),同時(shí)第三方庫 GJSON & SJSON 也在 json 處理方面表現(xiàn)出色。

本文將深入探討下 GJSON 組件,通過與原生處理方式對(duì)比,它存在什么特別之處,它的優(yōu)勢(shì)體現(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("解析錯(cuò)誤:", err)
        return
    }

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

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

二、GJSON 組件

1、概述

GJSON 是一個(gè)輕量級(jí)且高性能的 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ù)獲取

對(duì)于簡單的 json,像前面那個(gè)例子,直接用 gjson.Get 方法,傳入 json 字符串和要獲取的字段名,就能拿到對(duì)應(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ù)獲取

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

{
    "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ù)組,對(duì)于這種的處理也比較簡單,直接通過數(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個(gè)愛好
    fmt.Println("hobby:", hobby.String())
}

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

四、GJSON 與原生 JSON 處理方式對(duì)比

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

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

相關(guān)文章

  • Golang 如何判斷數(shù)組某個(gè)元素是否存在 (isset)

    Golang 如何判斷數(shù)組某個(gè)元素是否存在 (isset)

    這篇文章主要介紹了Golang 如何判斷數(shù)組某個(gè)元素是否存在 (isset),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 一文帶你了解Golang中的并發(fā)性

    一文帶你了解Golang中的并發(fā)性

    并發(fā)是一個(gè)很酷的話題,一旦你掌握了它,就會(huì)成為一筆巨大的財(cái)富。所以本文就來和大家一起來聊聊Golang中的并發(fā)性,感興趣的可以了解一下
    2023-03-03
  • GO語言基礎(chǔ)入門第一個(gè)go程序解讀

    GO語言基礎(chǔ)入門第一個(gè)go程序解讀

    這篇文章主要為大家介紹了GO語言基礎(chǔ)入門的第一個(gè)go程序解讀,下面來帶大家進(jìn)入Go語言世界helloworld的大門吧,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • 一文帶你了解Golang中interface的設(shè)計(jì)與實(shí)現(xiàn)

    一文帶你了解Golang中interface的設(shè)計(jì)與實(shí)現(xiàn)

    本文就來詳細(xì)說說為什么說?接口本質(zhì)是一種自定義類型,以及這種自定義類型是如何構(gòu)建起?go?的?interface?系統(tǒng)的,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-01-01
  • Golang定時(shí)器的2種實(shí)現(xiàn)方法與區(qū)別

    Golang定時(shí)器的2種實(shí)現(xiàn)方法與區(qū)別

    這篇文章主要給大家介紹了關(guān)于Golang定時(shí)器的2種實(shí)現(xiàn)方法與區(qū)別的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • go語言中slice,map,channl底層原理

    go語言中slice,map,channl底層原理

    這篇文章主要介紹了go語言中slice,map,channl底層原理,slice,map,channl是我們Go語言中最最常用的幾個(gè)數(shù)據(jù)結(jié)構(gòu),對(duì)于其更多相關(guān)內(nèi)容需要的小伙伴可以參考下面文章詳細(xì)內(nèi)容
    2022-06-06
  • golang之?dāng)?shù)據(jù)校驗(yàn)的實(shí)現(xiàn)代碼示例

    golang之?dāng)?shù)據(jù)校驗(yàn)的實(shí)現(xiàn)代碼示例

    這篇文章主要介紹了golang之?dāng)?shù)據(jù)校檢的實(shí)現(xiàn)代碼示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Ubuntu安裝Go語言運(yùn)行環(huán)境

    Ubuntu安裝Go語言運(yùn)行環(huán)境

    由于最近偏愛Ubuntu,在加上作為一門開源語言,在Linux上從源代碼開始搭建環(huán)境更讓人覺得有趣味性。讓我們直接先從Go語言的環(huán)境搭建開始
    2015-04-04
  • Golang連接Redis數(shù)據(jù)庫的方法

    Golang連接Redis數(shù)據(jù)庫的方法

    這篇文章主要介紹了Golang連接Redis數(shù)據(jù)庫的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 提升Golang應(yīng)用性能:深入理解Context的應(yīng)用

    提升Golang應(yīng)用性能:深入理解Context的應(yīng)用

    本文將深入探討如何通過深入理解和正確應(yīng)用Go語言中的Context來提升應(yīng)用性能。需要的朋友可以參考下
    2023-09-09

最新評(píng)論

岱山县| 静乐县| 通化县| 桐梓县| 新乡县| 文安县| 永州市| 视频| 项城市| 教育| 金阳县| 陇南市| 慈溪市| 奈曼旗| 依安县| 安丘市| 济南市| 南澳县| 达拉特旗| 襄城县| 东源县| 和龙市| 合山市| 彝良县| 清远市| 西宁市| 改则县| 连平县| 同心县| 仁化县| 敦煌市| 南岸区| 会理县| 秦安县| 泰宁县| 宁陵县| 神池县| 贡觉县| 桑日县| 图木舒克市| 峡江县|