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

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é)果。可以查看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之后,手動調(diào)用了一次Reset()方法。因?yàn)镴SONQ對象在調(diào)用Find方法時(shí),內(nèi)部會記錄當(dāng)前的節(jié)點(diǎn),下一個(gè)查詢會從上次查找的節(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實(shí)現(xiàn)pdf中自動換行的表格

    利用golang實(shí)現(xiàn)pdf中自動換行的表格

    這篇文章主要給大家介紹了如何利用golang實(shí)現(xiàn)pdf中自動換行的表格,文中通過代碼示例給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • 基于Go語言實(shí)現(xiàn)應(yīng)用IP防火墻

    基于Go語言實(shí)現(xiàn)應(yīng)用IP防火墻

    在公司里面經(jīng)常會聽到某應(yīng)用有安全漏洞問題,沒有做安全加固,IP防火墻就是一個(gè)典型的安全加固解決方案,下面我們就來學(xué)習(xí)一下如何使用go語言實(shí)現(xiàn)IP防火墻吧
    2023-11-11
  • 詳解在Go語言單元測試中如何解決文件依賴問題

    詳解在Go語言單元測試中如何解決文件依賴問題

    現(xiàn)如今的?Web?應(yīng)用程序往往采用?RESTful?API?接口形式對外提供服務(wù),后端接口直接向前端返回?HTML?文件的情況越來越少,所以在程序中操作文件的場景也變少了,在編寫單元測試時(shí),文件就成了被測試代碼的外部依賴,本文就來講解下測試過程中如何解決文件外部依賴問題
    2023-08-08
  • 詳解如何使用Golang操作MongoDB數(shù)據(jù)庫

    詳解如何使用Golang操作MongoDB數(shù)據(jù)庫

    在現(xiàn)代開發(fā)中,數(shù)據(jù)存儲是一個(gè)至關(guān)重要的環(huán)節(jié),MongoDB作為一種NoSQL數(shù)據(jù)庫,提供了強(qiáng)大的功能和靈活的數(shù)據(jù)模型,與Golang的高性能和并發(fā)性能非常契合,本文將探討Golang與MongoDB的完美組合,介紹如何使用Golang操作MongoDB數(shù)據(jù)庫,需要的朋友可以參考下
    2023-11-11
  • Go語言題解LeetCode463島嶼的周長示例詳解

    Go語言題解LeetCode463島嶼的周長示例詳解

    這篇文章主要為大家介紹了Go語言題解LeetCode463島嶼的周長示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • GoLang函數(shù)棧的使用詳細(xì)講解

    GoLang函數(shù)棧的使用詳細(xì)講解

    這篇文章主要介紹了GoLang函數(shù)棧的使用,我們的代碼會被編譯成機(jī)器指令并寫入到可執(zhí)行文件,當(dāng)程序執(zhí)行時(shí),可執(zhí)行文件被加載到內(nèi)存,這些機(jī)器指令會被存儲到虛擬地址空間中的代碼段,在代碼段內(nèi)部,指令是低地址向高地址堆積的
    2023-02-02
  • golang使用接口進(jìn)行靈活緩存

    golang使用接口進(jìn)行靈活緩存

    緩存是編程中一種常見的技術(shù),通過存儲昂貴的計(jì)算或?IO?結(jié)果來快速查找,從而提高性能,本文將介紹一下Go的接口如何幫助構(gòu)建靈活、可擴(kuò)展的緩存,感興趣的可以了解下
    2023-09-09
  • Go語言中的if條件語句使用詳解

    Go語言中的if條件語句使用詳解

    這篇文章主要介紹了Go語言中的if條件語句的使用,包括if...else語句以及相關(guān)嵌套,需要的朋友可以參考下
    2015-10-10
  • 詳解如何在Go服務(wù)中做鏈路追蹤

    詳解如何在Go服務(wù)中做鏈路追蹤

    使用 Go 語言開發(fā)微服務(wù)的時(shí)候,需要追蹤每一個(gè)請求的訪問鏈路,本文主要介紹了如何在Go 服務(wù)中做鏈路追蹤,感興趣的可以了解一下
    2021-09-09
  • Go項(xiàng)目配置管理神器之viper的介紹與使用詳解

    Go項(xiàng)目配置管理神器之viper的介紹與使用詳解

    viper是一個(gè)完整的?Go應(yīng)用程序的配置解決方案,它被設(shè)計(jì)為在應(yīng)用程序中工作,并能處理所有類型的配置需求和格式,下面這篇文章主要給大家介紹了關(guān)于Go項(xiàng)目配置管理神器之viper的介紹與使用,需要的朋友可以參考下
    2023-02-02

最新評論