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

golang解析json數(shù)據(jù)的4種方法總結(jié)

 更新時(shí)間:2023年06月16日 08:40:37   作者:田土豆  
在日常工作中每一名開發(fā)者,不管是前端還是后端,都經(jīng)常使用 JSON,下面這篇文章主要給大家介紹了關(guān)于golang解析json數(shù)據(jù)的4種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

現(xiàn)在有一個(gè)json格式的字符串,應(yīng)該怎么解析呢,這里總結(jié)了以下4種方法

1. json.Unmarshal

函數(shù)func json.Unmarshal(data []byte, v any) error就是用來解析json編碼的data,然后將結(jié)果保存在指針v指向的值里

e.g.

package main

import (
	"encoding/json"
	"fmt"
)

type user struct {
	Name    string
	Married bool
	Address struct {
		City    string
		Country string
	}
}

func main() {
	user1 := `{
		"name": "tian",
		"married": false,
		"address": {
		  "city": "beijing",
		  "country": "China"
		}
	  }`
	user1Struct := &user{}
	json.Unmarshal([]byte(user1), user1Struct)
	fmt.Printf("解碼后的結(jié)果為:%v", *user1Struct)
}
  • 首先根據(jù)json數(shù)據(jù)的格式定義struct,用來保存解碼后的值。這里首先定義了一個(gè)user結(jié)構(gòu)體,然后通過json.Unmarshal進(jìn)行解碼
  • 缺點(diǎn)很明顯,如果json數(shù)據(jù)很復(fù)雜,自定義的struct就跟著復(fù)雜。

程序運(yùn)行后的結(jié)果如下:

PS E:\goland-workspace\GolangLearning\Common\json數(shù)據(jù)處理\unmarshal> go run .\main.go
解碼后的結(jié)果為:{tian false {beijing China}}

2. viper.ReadConfig

使用go get -u github.com/spf13/viper 進(jìn)行下載

函數(shù)func viper.ReadConfig(in io.Reader) error用于從in中讀取數(shù)據(jù)并解析

e.g.

package main

import (
	"fmt"
	"strings"

	"github.com/spf13/viper"
)

func main() {
	user1 := `{
		"name": "tian",
		"married": false,
		"address": {
		  "city": "beijing",
		  "country": "China"
		}
	  }`
	// 指定配置的類型為json
	viper.SetConfigType("json")
	// 讀取數(shù)據(jù)
	if err := viper.ReadConfig(strings.NewReader(user1)); err != nil {
		fmt.Println(err)
	}
	fmt.Printf("數(shù)據(jù)的所有鍵值: %v\n", viper.AllKeys())
	fmt.Printf("解析后的數(shù)據(jù):%v\n", viper.AllSettings())
	fmt.Printf("the type of \"married\" is %s\n", reflect.TypeOf(viper.Get("married")))
	fmt.Printf("The name is %s and the country is %s\n", viper.Get("name"), viper.Get("address.country"))
}

首先要通過viper.SetConfigType("json")指定要解析數(shù)據(jù)的格式,否則即使viper.ReadConfig返回值沒有報(bào)錯(cuò),也得不到解析后的結(jié)果??梢圆榭?a rel="external nofollow" target="_blank">https://github.com/spf13/viper/issues/316

方法viper.Get(),viper.GetString(),viper.GetBool()等等可以方便獲取鍵值,同時(shí)對于鍵值的類型也能很好的判斷

程序運(yùn)行后的結(jié)果如下:

PS E:\goland-workspace\GolangLearning\Common\json數(shù)據(jù)處理\viper> go run .\main.go
數(shù)據(jù)的所有鍵值: [address.city address.country name married]
解析后的數(shù)據(jù):map[address:map[city:beijing country:China] married:false name:tian]
the type of "married" is bool
The name is tian and the country is China

3. simplejson.NewJson

使用go get -u "github.com/bitly/go-simplejson"進(jìn)行下載

e.g.

package main

import (
	"fmt"

	"github.com/bitly/go-simplejson"
)

func main() {
	user1 := `{
		"name": "tian",
		"married": false,
		"address": {
		  "city": "beijing",
		  "country": "China"
		}
	  }`

	user1json, err := simplejson.NewJson([]byte(user1))
	if err != nil {
		fmt.Println(err)
	}
	name1, _ := user1json.Get("name").String()
	city1, _ := user1json.Get("address").Get("city").String()
	fmt.Printf("The name is %s and the city is %s", name1, city1)
}

程序運(yùn)行后的結(jié)果如下:

PS E:\goland-workspace\GolangLearning\Common\json數(shù)據(jù)處理\simpleJson> go run .\main.go
The name is tian and the city is beijing

4. gojsonq.New().FromString()

使用go get -u github.com/thedevsaddam/gojsonq安裝

e.g.

package main

import (
	"fmt"

	"github.com/thedevsaddam/gojsonq/v2"
)

func main() {
	user1 := `{
		"name": "tian",
		"married": false,
		"address": {
		  "city": "beijing",
		  "country": "China"
		}
	  }`

	user1json := gojsonq.New().FromString(user1)
	name1 := user1json.Find("name").(string)

	user1json.Reset()
	city1 := user1json.Find("address.city")
	fmt.Printf("The name is %s and the city is %v", name1, city1)
}

在第一次查詢name之后,手動(dòng)調(diào)用了一次Reset()方法。因?yàn)镴SONQ對象在調(diào)用Find方法時(shí),內(nèi)部會(huì)記錄當(dāng)前的節(jié)點(diǎn),下一個(gè)查詢會(huì)從上次查找的節(jié)點(diǎn)開始

程序運(yùn)行后的結(jié)果如下:

PS E:\goland-workspace\GolangLearning\Common\json數(shù)據(jù)處理\gojsonq> go run .\main.go
The name is tian and the city is beijing

總結(jié)

到此這篇關(guān)于golang解析json數(shù)據(jù)的4種方法的文章就介紹到這了,更多相關(guān)golang解析json數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang通過node_exporter監(jiān)控GPU及cpu頻率、溫度的代碼

    golang通過node_exporter監(jiān)控GPU及cpu頻率、溫度的代碼

    node_exporter這個(gè)開源組件是配合prometheus收集主機(jī)操作系統(tǒng)層的metrics的常用組件,但是官方?jīng)]有提供GPU卡的metrics的采集,今天通過本文給大家介紹golang通過node_exporter監(jiān)控GPU及cpu頻率、溫度的相關(guān)知識,感興趣的朋友一起看看吧
    2022-05-05
  • Golang設(shè)計(jì)模式之原型模式詳細(xì)講解

    Golang設(shè)計(jì)模式之原型模式詳細(xì)講解

    如果一個(gè)類的有非常多的屬性,層級還很深。每次構(gòu)造起來,不管是直接構(gòu)造還是用建造者模式,都要對太多屬性進(jìn)行復(fù)制,那么有沒有一種好的方式讓我們創(chuàng)建太的時(shí)候使用體驗(yàn)更好一點(diǎn)呢? 今天的文章里就給大家介紹一種設(shè)計(jì)模式,來解決這個(gè)問題
    2023-01-01
  • 在Golang中使用http.FileServer返回靜態(tài)文件的操作

    在Golang中使用http.FileServer返回靜態(tài)文件的操作

    這篇文章主要介紹了在Golang中使用http.FileServer返回靜態(tài)文件的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang Map實(shí)現(xiàn)賦值和擴(kuò)容的示例代碼

    Golang Map實(shí)現(xiàn)賦值和擴(kuò)容的示例代碼

    這篇文章主要介紹了Golang Map實(shí)現(xiàn)賦值和擴(kuò)容的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 一文深入探索Go語言中的循環(huán)結(jié)構(gòu)

    一文深入探索Go語言中的循環(huán)結(jié)構(gòu)

    在編程中,循環(huán)結(jié)構(gòu)扮演著重要的角色,它使我們能夠有效地重復(fù)執(zhí)行特定的代碼塊,以實(shí)現(xiàn)各種任務(wù)和邏輯,在Go語言中,for 是 Go 中唯一的循環(huán)結(jié)構(gòu),本文將深入探討Go語言中的for循環(huán)類型以及它們的用法
    2023-08-08
  • Golang集成FFmpeg的音視頻處理的實(shí)現(xiàn)

    Golang集成FFmpeg的音視頻處理的實(shí)現(xiàn)

    FFmpeg是一個(gè)開源的音視頻處理工具,廣泛用于視頻轉(zhuǎn)換、截圖、處理和流媒體推送等操作,本文主要介紹了Golang集成FFmpeg的音視頻處理的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • 簡單高效!Go語言封裝二級認(rèn)證功能實(shí)現(xiàn)

    簡單高效!Go語言封裝二級認(rèn)證功能實(shí)現(xiàn)

    本文將介紹如何使用Go語言封裝二級認(rèn)證功能,實(shí)現(xiàn)簡單高效的用戶認(rèn)證流程,二級認(rèn)證是一種安全措施,要求用戶在登錄后進(jìn)行額外的身份驗(yàn)證,以提高賬戶安全性,
    2023-10-10
  • 一文帶你了解Go中跟蹤函數(shù)調(diào)用鏈的實(shí)現(xiàn)

    一文帶你了解Go中跟蹤函數(shù)調(diào)用鏈的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了go如何實(shí)現(xiàn)一個(gè)自動(dòng)注入跟蹤代碼,并輸出有層次感的函數(shù)調(diào)用鏈跟蹤命令行工具,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • Go單元測試對GORM進(jìn)行Mock測試

    Go單元測試對GORM進(jìn)行Mock測試

    這篇文章主要為大家介紹了Go單元測試對GORM進(jìn)行Mock測試用例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • golang協(xié)程關(guān)閉踩坑實(shí)戰(zhàn)記錄

    golang協(xié)程關(guān)閉踩坑實(shí)戰(zhàn)記錄

    協(xié)程(coroutine)是Go語言中的輕量級線程實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于golang協(xié)程關(guān)閉踩坑的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03

最新評論

海丰县| 本溪市| 广灵县| 青海省| 兴业县| 洪泽县| 时尚| 治多县| 南漳县| 西乡县| 上蔡县| 博湖县| 嘉义县| 汉阴县| 双流县| 辉县市| 安义县| 新野县| 博湖县| 辉县市| 漠河县| 天祝| 沂水县| 建德市| 马龙县| 太湖县| 龙海市| 龙井市| 金寨县| 高平市| 剑川县| 武陟县| 斗六市| 大埔县| 昆山市| 重庆市| 杂多县| 顺义区| 海门市| 叶城县| 菏泽市|