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

Go語(yǔ)言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON

 更新時(shí)間:2022年01月17日 09:50:24   作者:宇宙之一粟  
本文主要介紹了Go語(yǔ)言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

在日常工作中,除了需要從 JSON 轉(zhuǎn)化為 Go 的數(shù)據(jù)結(jié)構(gòu)。但往往相反的情況是:我們需要將數(shù)據(jù)以 JSON 字符串的形式發(fā)送到 Web 服務(wù)器。今天我們將學(xué)會(huì)如何從一個(gè)結(jié)構(gòu)化數(shù)據(jù)編碼為 JSON 。

Json(Javascript Object Nanotation)是一種數(shù)據(jù)交換格式,常用于前后端數(shù)據(jù)傳輸。任意一端將數(shù)據(jù)轉(zhuǎn)換成json 字符串,另一端再將該字符串解析成相應(yīng)的數(shù)據(jù)結(jié)構(gòu),如string類型,strcut對(duì)象等。

結(jié)構(gòu)體轉(zhuǎn)為 JSON 格式

比如,我們有如下的結(jié)構(gòu)體:

type Student struct {
? ? Name string
? ? Age int
? ? Address Address
}

type Address struct {
? ? Road string
? ? Street string
? ? City string
? ? Province string
? ? Country string
}

Zhang3 := Student{
?? ??? ?Name: "張三",
?? ??? ?Age: ?18,
?? ??? ?Address: Address{
?? ??? ??? ?Road: ? ? "renmin south road",
?? ??? ??? ?Street: ? "123 street",
?? ??? ??? ?City: ? ? "cs",
?? ??? ??? ?Province: "hn",
?? ??? ??? ?Country: ?"CN",
?? ??? ?},
?? ?}

將學(xué)生編碼為 JSON 格式,我們可以使用 JSON 包中的 json.Marshl() 函數(shù):

Info_of_Zhang3, err := json.Marshal(Zhang3)
if err == nil {
? ? fmt.Println(string(Info_of_Zhang3))
} else {
? ? fmt.Println(err)
? ? return
}

Marshal() 函數(shù)返回編碼后的 JSON (字節(jié)切片)和 error 信息(如果出錯(cuò)的話)。然后我們可以打印 JSON 字符串。
完整代碼如下:

package main

import (
?? ?"encoding/json"
?? ?"fmt"
)

type Student struct {
?? ?Name ? ?string
?? ?Age ? ? int
?? ?Address Address
}

type Address struct {
?? ?Road ? ? string
?? ?Street ? string
?? ?City ? ? string
?? ?Province string
?? ?Country ?string
}

func main() {

?? ?Zhang3 := Student{
?? ??? ?Name: "張三",
?? ??? ?Age: ?18,
?? ??? ?Address: Address{
?? ??? ??? ?Road: ? ? "renmin south road",
?? ??? ??? ?Street: ? "123 street",
?? ??? ??? ?City: ? ? "cs",
?? ??? ??? ?Province: "hn",
?? ??? ??? ?Country: ?"CN",
?? ??? ?},
?? ?}

?? ?Info_of_Zhang3, err := json.Marshal(Zhang3)
?? ?if err == nil {
?? ??? ?fmt.Println(string(Info_of_Zhang3))
?? ?} else {
?? ??? ?fmt.Println(err)
?? ??? ?return
?? ?}

}

運(yùn)行代碼,得到如下 JSON 數(shù)據(jù)結(jié)果:

$ go run main.go
{"Name":"張三","Age":18,"Address":{"Road":"renmin south road","Street":"123 street","City":"cs","Province":"hn","Country":"CN"}}

當(dāng)你看 JSON 輸出時(shí),你可能已經(jīng)注意到?jīng)]有縮進(jìn)。如果你想縮進(jìn)輸出并很好地格式化它,你可以使用json. MarshalIndent()函數(shù)。
比如,使用如下語(yǔ)句:

Info_of_Zhang3, err := json.MarshalIndent(Zhang3, "", "    ")

函數(shù)解析:第二個(gè)參數(shù)指定每行輸出的開(kāi)頭的字符串。輸出的開(kāi)頭,第三個(gè)參數(shù)指定每行要縮進(jìn)的字符串。此時(shí)json.MarshalIndent(Zhang3, "", "    ")可以得到如下的輸出:

{
    "Name": "張三",
    "Age": 18,
    "Address": {
        "Road": "renmin south road",
        "Street": "123 street",
        "City": "cs",
        "Province": "hn",
        "Country": "CN"
    }
}

接口轉(zhuǎn)為 JSON 格式

有時(shí)您并不希望固定結(jié)構(gòu)中的字段數(shù)量。 相反,您希望能夠在需要的時(shí)候添加額外的數(shù)據(jù)。您可以使用空接口來(lái)實(shí)現(xiàn)這一點(diǎn),如下所示:

type Student map[string] interface{}
type Address map[string] interface{}

使用空接口,可以創(chuàng)建自己的 Student 變量,還可以添加想要的元素,就像這樣:

Zhang3 := Student{
    "Name": "張三",
    "Age": 18,
    "Address": Address{
        "Road": "renmin south road",
        "Street": "123 street",
        "City": "cs",
        "Province": "hn",
        "Country": "CN",
    },
    "Year": 2022,    // 新增學(xué)年
}

完整代碼如下:

package main

import (
?? ?"encoding/json"
?? ?"fmt"
)

type Student map[string]interface{}
type Address map[string]interface{}

func main() {
?? ?Zhang3 := Student{
?? ??? ?"Name": "張三",
?? ??? ?"Age": ?18,
?? ??? ?"Address": Address{
?? ??? ??? ?"Road": ? ? "renmin south road",
?? ??? ??? ?"Street": ? "123 street",
?? ??? ??? ?"City": ? ? "cs",
?? ??? ??? ?"Province": "hn",
?? ??? ??? ?"Country": ?"CN",
?? ??? ?},
?? ??? ?"Year": ? ? ? 2022, // 新增學(xué)年
?? ??? ?"GraduateAt": 2026, // 畢業(yè)年份
?? ?}

?? ?InfoOfZhang3, err := json.MarshalIndent(Zhang3, "", " ? ?")
?? ?if err == nil {
?? ??? ?fmt.Println(string(InfoOfZhang3))
?? ?} else {
?? ??? ?fmt.Println(err)
?? ?}
}

代碼輸出結(jié)果為:

{
    "Address": {
        "City": "cs",
        "Country": "CN",
        "Province": "hn",
        "Road": "renmin south road",
        "Street": "123 street"
    },
    "Age": 18,
    "GraduateAt": 2026,
    "Name": "張三",
    "Year": 2022
}

同時(shí)我們能看到輸出的 JSON 中的鍵的順序是按字母排序的。

Marshal() 函數(shù)的原型

我們看一下 Marshal 函數(shù):

func Marshal(v interface{}) ([]byte, error) {
? ?e := newEncodeState()

? ?err := e.marshal(v, encOpts{escapeHTML: true})
? ?if err != nil {
? ? ? return nil, err
? ?}
? ?buf := append([]byte(nil), e.Bytes()...)

? ?e.Reset()
? ?encodeStatePool.Put(e)

? ?return buf, nil
}

函數(shù)可以接收任意類型的接口數(shù)據(jù) v,并轉(zhuǎn)換為字節(jié)數(shù)組類型,返回值就是 JSON 數(shù)據(jù)和錯(cuò)誤信息;若轉(zhuǎn)換成功,則 err == nil;
在進(jìn)行對(duì)象轉(zhuǎn)換為JSON的過(guò)程中,會(huì)遵循一下幾條原則:
a. 布爾型轉(zhuǎn)換為JSON后仍然是布爾型;
b. 浮點(diǎn)型轉(zhuǎn)換為JSON后里面的常規(guī)數(shù)字;
c. 字符串將以 UTF-8 編碼轉(zhuǎn)化輸出為 Unicode 字符串,將特殊字符轉(zhuǎn)義;
d. 數(shù)組和切片被轉(zhuǎn)換為JSON里面的數(shù)組,[]byte類會(huì)被轉(zhuǎn)換為 base64 編碼后的字符串,slice的零值被轉(zhuǎn)換為null;
e. 結(jié)構(gòu)體轉(zhuǎn)換為 JSON 對(duì)象,并且只有結(jié)構(gòu)體內(nèi)變量必須首字母大寫(xiě),才可被導(dǎo)出的字段轉(zhuǎn)化輸出,而且這些字段會(huì)被作為 JSON 對(duì)象的字符串索引;
f. 轉(zhuǎn)換一個(gè) map 類型的數(shù)據(jù)結(jié)構(gòu)時(shí),該數(shù)據(jù)的類型必須時(shí) map[string]T ,T 可以是encoding/json 包支持的任意類型。

總結(jié)

本文只是簡(jiǎn)單的把 Go 語(yǔ)言常見(jiàn)的結(jié)構(gòu)體和接口轉(zhuǎn)化為 JSON 數(shù)據(jù),其他類型類似,最后給出了編碼的函數(shù) Marshal() 原型, 并簡(jiǎn)單進(jìn)行了解釋。

除此之外,encoding/json 包還提供了 Encode() 和 Decode() 函數(shù)用于單一對(duì)象的格式轉(zhuǎn)化,而 Marshal() 和 Unmarshal() 函數(shù)工作于多個(gè)對(duì)象和字節(jié)流上。

其實(shí),本文只是簡(jiǎn)單的介紹了 Go 語(yǔ)言和 JSON 數(shù)據(jù)在控制臺(tái)的簡(jiǎn)單轉(zhuǎn)化,等后續(xù)的文章介紹了文件讀取和寫(xiě)入時(shí),就可以學(xué)會(huì)與 JSON 文件打交道了。敬請(qǐng)期待!

到此這篇關(guān)于Go 轉(zhuǎn) JSON的文章就介紹到這了,更多相關(guān)Go 轉(zhuǎn) JSON內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用golang生成prometheus格式數(shù)據(jù)

    使用golang生成prometheus格式數(shù)據(jù)

    Prometheus是一個(gè)開(kāi)源的監(jiān)控系統(tǒng),擁有許多Advanced?Feature,本文將介紹Primetheus?client的使用,并基于golang生成prometheus格式數(shù)據(jù),希望對(duì)大家有所幫助
    2025-02-02
  • Golang中Model的具體使用

    Golang中Model的具體使用

    本文主要介紹了Golang中Model的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Go語(yǔ)言中map集合的具體使用

    Go語(yǔ)言中map集合的具體使用

    本文主要介紹了Go語(yǔ)言中map集合的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • golang實(shí)現(xiàn)分頁(yè)算法實(shí)例代碼

    golang實(shí)現(xiàn)分頁(yè)算法實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于golang實(shí)現(xiàn)分頁(yè)算法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Golang限流器time/rate設(shè)計(jì)與實(shí)現(xiàn)詳解

    Golang限流器time/rate設(shè)計(jì)與實(shí)現(xiàn)詳解

    在?Golang?庫(kù)中官方給我們提供了限流器的實(shí)現(xiàn)golang.org/x/time/rate,它是基于令牌桶算法(Token?Bucket)設(shè)計(jì)實(shí)現(xiàn)的,下面我們就來(lái)看看他的具體使用吧
    2024-03-03
  • Go語(yǔ)言多人聊天室項(xiàng)目實(shí)戰(zhàn)

    Go語(yǔ)言多人聊天室項(xiàng)目實(shí)戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言多人聊天室項(xiàng)目實(shí)戰(zhàn),實(shí)現(xiàn)單撩或多撩等多種功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • golang與非golang程序探測(cè)beyla源碼解讀

    golang與非golang程序探測(cè)beyla源碼解讀

    這篇文章主要為大家介紹了beyla源碼解讀之golang與非golang程序的探測(cè)實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • golang的os包用法詳解

    golang的os包用法詳解

    Go語(yǔ)言的 os 包中提供了操作系統(tǒng)函數(shù)的接口,是一個(gè)比較重要的包。顧名思義,os 包的作用主要是在服務(wù)器上進(jìn)行系統(tǒng)的基本操作,本文將詳細(xì)介紹了golang的os包用法,需要的朋友可以參考下
    2023-05-05
  • Go語(yǔ)言基礎(chǔ)設(shè)計(jì)模式之策略模式示例詳解

    Go語(yǔ)言基礎(chǔ)設(shè)計(jì)模式之策略模式示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)設(shè)計(jì)模式之策略模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • Golang中的new()和make()函數(shù)本質(zhì)區(qū)別

    Golang中的new()和make()函數(shù)本質(zhì)區(qū)別

    在 Go 語(yǔ)言開(kāi)發(fā)中,new() 和 make() 是兩個(gè)容易讓開(kāi)發(fā)者感到困惑的內(nèi)建函數(shù),盡管它們都用于內(nèi)存分配,但其設(shè)計(jì)目的、適用場(chǎng)景和底層實(shí)現(xiàn)存在本質(zhì)差異,本文將通過(guò)類型系統(tǒng)、內(nèi)存模型和編譯器實(shí)現(xiàn)三個(gè)維度,深入解析這兩個(gè)函數(shù)的本質(zhì)區(qū)別,感興趣的朋友一起看看吧
    2025-02-02

最新評(píng)論