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

詳解Go語言中結構體與JSON間的轉換

 更新時間:2022年12月13日 14:07:26   作者:陳明勇  
這篇文章主要為大家詳細介紹了Go語言中結構體與JSON間的轉換,文中的示例代碼講解詳細,對學習Go語言有一定的幫助,需要的可以參考一下

前言

在日常開發(fā)中,我們往往會將 JSON 解析成對應的結構體,反之也會將結構體轉成 JSON。接下來本文會通過 JSON 包的兩個函數(shù),來介紹 JSON 與結構體之間的轉換。

結構體轉 JSON

Marshal(v any) ([]byte, error):將 v 轉成 JSON 數(shù)據(jù),以 []byte 的形式返回。

import (
    "encoding/json"
    "fmt"
)

type User struct {
    Name           string
    Age            int
    Height         float64
    Weight         *float64
    Child          bool
    marriageStatus string
}

func main() {
    weight := 120.5
    user := User{
        Name:           "gopher",
        Age:            18,
        Height:         180.5,
        Weight:         &weight,
        Child:          false,
        marriageStatus: "未婚",
    }
    jsonBytes, err := json.Marshal(user)
    if err != nil {
        fmt.Println("error: ", err)
        return
    }
    fmt.Println(string(jsonBytes)) // {"Name":"gopher","Age":18,"Height":180.5,"Weight":120.5,"Child":false}
}

執(zhí)行結果:

{"Name":"gopher","Age":18,"Height":180.5,"Weight":120.5,"Child":false}

根據(jù)結果可知:

  • 不可導出字段(字段名以小寫字母開頭),是不能被轉成 JSONkey 的,這也符合 Go 的語法規(guī)定,以小寫字母開頭的變量或結構體字段等,不能在包外被訪問。
  • 轉換后的字段名,與結構體字段的名字一樣。
  • 如果字段是指針類型,轉換后的值為指針指向的字段值。

如果我們想要指定字段轉換之后的命名,或者將一個可導出的字段進行忽略,可以通過給結構體字段打上 JSON 標簽的方式實現(xiàn)。

import (
    "encoding/json"
    "fmt"
)

type User struct {
    Name           string   `json:"name"`
    Age            int      `json:"age"`
    Height         float64  `json:"height"`
    Weight         *float64 `json:"weight"`
    Child          bool     `json:"child"`
    MarriageStatus string   `json:"-"`
}

func main() {
    weight := 120.5
    user := User{
        Name:           "gopher",
        Age:            18,
        Height:         180.5,
        Weight:         &weight,
        Child:          false,
        MarriageStatus: "未婚",
    }
    jsonBytes, err := json.Marshal(user)
    if err != nil {
        fmt.Println("error: ", err)
        return
    }
    fmt.Println(string(jsonBytes)) // {"name":"gopher","age":18,"height":180.5,"weight":120.5,"child":false}
}

通過給結構體字段定打上 JSON 標簽,可指定轉成 JSON 后的字段名,如果 JSON 標簽的值為 -,則在轉換 JSON 時忽略此字段。

JSON 解析結構體

Unmarshal(data []byte, v any) error:將 JSON 解析成指定的結構體。

import (
    "encoding/json"
    "fmt"
)

type User struct {
    Name           string  `json:"name"`
    Age            int     `json:"age"`
    Height         float64 `json:"height"`
    Child          bool    `json:"-"`
    marriageStatus string
}

func main() {
    userStr := `
    {
      "name": "gopher",
      "age": 18,
      "height": 180.5,
      "child": true,
      "marriageStatus": "未婚"
    }
    `
    user := &User{}
    err := json.Unmarshal([]byte(userStr), &user)
    if err != nil {
        fmt.Println("error: ", err)
        return
    }
    fmt.Printf("%#v", user) // &main.User{Name:"gopher", Age:18, Height:180.5, Child:false, marriageStatus:""}
}

執(zhí)行結果:

&main.User{Name:"gopher", Age:18, Height:180.5, Child:false, marriageStatus:""}

根據(jù)結果可知:

使用Unmarshal函數(shù)時,我們需要傳入結構體的指針類型,否則結構體字段的值將不會被改變,因為底層是通過指針去修改結構體字段的值。

JSON 解析時,JSONkey 與結構體字段的匹配規(guī)則是:

  • 優(yōu)先查找 JSON 標簽值和 key 一樣的,找到則將 value 賦值給對應字段。
  • 如果沒有 JSON 標簽值與 key 相匹配,則根據(jù)字段名進行匹配。

可以發(fā)現(xiàn),如果結構體字段是非導出字段或 JSON 標簽的值為 -,將不會被匹配到。

小結

本文介紹了 Go 語言里,JSON 與結構體之間的轉換。在結構體轉 JSON 時,我們可以通過給字段打標簽,指定轉換后的 key 命名,需要注意的是,如果結構體的字段為非導出字段或字段的 JSON 標簽值為 -,在轉換 JSON 時,將會被忽略。反之 JSON 解析結構體時也是一樣的。

到此這篇關于詳解Go語言中結構體與JSON間的轉換的文章就介紹到這了,更多相關Go語言結構體 JSON內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • golang 流式讀取和發(fā)送使用場景示例

    golang 流式讀取和發(fā)送使用場景示例

    這篇文章主要為大家介紹了golang 流式讀取和發(fā)送使用場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 詳解minio分布式文件存儲

    詳解minio分布式文件存儲

    MinIO 是一款基于 Go 語言的高性能、可擴展、云原生支持、操作簡單、開源的分布式對象存儲產(chǎn)品,這篇文章主要介紹了minio分布式文件存儲,需要的朋友可以參考下
    2023-10-10
  • Go數(shù)據(jù)庫遷移的實現(xiàn)步驟

    Go數(shù)據(jù)庫遷移的實現(xiàn)步驟

    本文主要介紹了Go數(shù)據(jù)庫遷移的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • Go?語言簡單實現(xiàn)Vigenere加密算法

    Go?語言簡單實現(xiàn)Vigenere加密算法

    這篇文章主要介紹了Go語言簡單實現(xiàn)Vigenere加密算法,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-09-09
  • 一文詳解Go Http Server原理

    一文詳解Go Http Server原理

    這篇文章主要為大家介紹了Go Http Server原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • go語言通過odbc操作Access數(shù)據(jù)庫的方法

    go語言通過odbc操作Access數(shù)據(jù)庫的方法

    這篇文章主要介紹了go語言通過odbc操作Access數(shù)據(jù)庫的方法,實例分析了Go語言通過odbc連接、查詢與關閉access數(shù)據(jù)庫的技巧,需要的朋友可以參考下
    2015-03-03
  • Go語言基礎知識點介紹

    Go語言基礎知識點介紹

    在本篇文章里小編給大家整理的是一篇關于Go語言基礎知識點介紹內容,有興趣的朋友們可以跟著學習參考下。
    2021-07-07
  • 用gin開發(fā)的golang項目三種開發(fā)模式方式

    用gin開發(fā)的golang項目三種開發(fā)模式方式

    這篇文章主要介紹了用gin開發(fā)的golang項目三種開發(fā)模式方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Go語言hello world實例

    Go語言hello world實例

    這篇文章主要介紹了Go語言hello world實例,本文先是給出了hello world的代碼實例,然后對一些知識點和技巧做了解釋,需要的朋友可以參考下
    2014-10-10
  • Golang中的Interface詳解

    Golang中的Interface詳解

    本文詳細講解了Golang中的Interface,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07

最新評論