Go結構體轉JSON

一、什麼是JSON

JSON(JavaScript Object Notation)是一種基於文本的輕量級數據交換格式。JSON採用完全獨立於語言的文本格式來描述數據,這些特性使得JSON成為理想的數據交換語言。JSON常見於前後端數據交互,也逐漸成為替代XML的數據交換格式。

二、Go語言中的JSON支持

Go語言內置json包,提供了JSON數據的編解碼功能,可直接導入使用。

import "encoding/json"

三、Go結構體轉JSON

Go語言中,結構體可以通過編寫tag的方法來定義該結構體的JSON格式。tag位於欄位的結構體定義下方,是編譯器在編譯時對欄位進行的描述。

通過tag的方式可以自定義JSON中的每個欄位名。在tag中添加一個名為`json:””` 的選項即可。

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    person := Person{Name: "Tom", Age: 18}
    jsonData, _ := json.Marshal(person)
    fmt.Println(string(jsonData))
}

上述代碼中,我們自定義了Person的兩個欄位在JSON中的名稱,即`name` 和 `age`。使用json.Marshal方法,將Person結構體轉換為JSON格式的字元串,輸出結果如下:

{"name":"Tom","age":18}

四、結構體嵌套轉換為JSON

在實際應用中,結構體通常包含多個欄位,甚至是嵌套結構體。在Go語言中,同樣可以通過tag的方式來定義結構體的JSON格式。

type Address struct {
    Province   string `json:"province"`
    City       string `json:"city"`
    Area       string `json:"area"`
    Street     string `json:"street"`
    PostalCode string `json:"postal_code"`
}

type Person struct {
    Name    string  `json:"name"`
    Age     int     `json:"age"`
    Address Address `json:"address"`
}

func main() {
    address := Address{Province: "ZheJiang", City: "HangZhou", Area: "XiHu", Street: "WenSanLu", PostalCode: "310023"}
    person := Person{Name: "Tom", Age: 18, Address: address}
    jsonData, _ := json.Marshal(person)
    fmt.Println(string(jsonData))
}

輸出結果如下:

{"name":"Tom","age":18,"address":{"province":"ZheJiang","city":"HangZhou","area":"XiHu","street":"WenSanLu","postal_code":"310023"}}

五、切片和Map轉換為JSON

除了結構體,切片和Map也經常出現在JSON編解碼中。和結構體一樣,切片和Map的轉換也需要通過tag的方式來指定鍵名。

type Person struct {
    Name    string              `json:"name"`
    Age     int                 `json:"age"`
    Hobbies []string            `json:"hobbies"`
    Metas   map[string]string   `json:"metas"`
}

func main() {
    person := Person{
        Name:    "Tom",
        Age:     18,
        Hobbies: []string{"coding", "running", "reading"},
        Metas:   map[string]string{"height": "184cm", "weight": "70kg"},
    }
    jsonData, _ := json.Marshal(person)
    fmt.Println(string(jsonData))
}

上述代碼中,我們定義了一個Person結構體,並且包含了切片和Map類型的欄位。使用json.Marshal方法,將Person結構體轉換為JSON格式的字元串,輸出結果如下:

{"name":"Tom","age":18,"hobbies":["coding","running","reading"],"metas":{"height":"184cm","weight":"70kg"}}

六、轉換為JSON時的返回值

在編寫代碼的過程中,我們可能會需要知道json.Marshal方法轉化後的返回值,該返回值有兩種類型。

第一種類型為`[]byte`類型,表示將結構體轉換為JSON格式後得到的位元組序列。

jsonData, err := json.Marshal(person)
if err != nil {
    // 錯誤處理
}

fmt.Println(jsonData)

第二種類型為`error`類型。當轉換出錯時,將返回該類型的非空值。

jsonData, err := json.Marshal(person)
if err != nil {
    // 錯誤處理
}

fmt.Println(err)

七、從JSON轉換為Go結構體

在實際開發中,還經常會遇到從JSON格式的字元串轉換為Go結構體的需求。Go語言中提供了json包中的json.Unmarshal方法來完成該轉換過程。

使用json.Unmarshal方法,我們需要聲明一個目標類型的指針,並調用json.Unmarshal方法來實現JSON格式字元串到指定類型的轉換。

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    jsonStr := `{"name":"Tom","age":18}`
    person := Person{}
    err := json.Unmarshal([]byte(jsonStr), &person)
    if err != nil {
        // 錯誤處理
    }
    fmt.Printf("%+v", person)
}

上述代碼中,我們聲明了一個Person結構體的指針變數`person`作為目標類型,並使用json.Unmarshal方法將JSON字元串轉換為結構體實例。輸出轉換後的Person對象,輸出結果如下:

{Name:"Tom", Age:18}

八、小結

Go語言內置的json包提供了完善的JSON編解碼功能,並且可以通過自定義tag的方式很容易地定義結構體的JSON格式。在實際開發中,我們需要熟練地掌握JSON轉換的API以及tag的定義方法。同時,我們需要考慮到各種數據的可能性,避免出現一些JSON轉換的異常狀況。

原創文章,作者:VIDZ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/136228.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
VIDZ的頭像VIDZ
上一篇 2024-10-04 00:16
下一篇 2024-10-04 00:16

相關推薦

  • 運維Python和GO應用實踐指南

    本文將從多個角度詳細闡述運維Python和GO的實際應用,包括監控、管理、自動化、部署、持續集成等方面。 一、監控 運維中的監控是保證系統穩定性的重要手段。Python和GO都有強…

    編程 2025-04-29
  • go-chassis

    本文將深入探究go-chassis,包括它的基本概念,特性,以及如何使用它構建微服務應用程序。 一、微服務架構及其優勢 微服務架構是一種將應用程序拆分為小型、自治服務的體系結構。每…

    編程 2025-04-29
  • Vue TS工程結構用法介紹

    在本篇文章中,我們將從多個方面對Vue TS工程結構進行詳細的闡述,涵蓋文件結構、路由配置、組件間通訊、狀態管理等內容,並給出對應的代碼示例。 一、文件結構 一個好的文件結構可以極…

    編程 2025-04-29
  • JSON的MD5

    在Web開發過程中,JSON(JavaScript Object Notation)是最常用的數據格式之一。MD5(Message-Digest Algorithm 5)是一種常用…

    編程 2025-04-29
  • Python程序的三種基本控制結構

    控制結構是編程語言中非常重要的一部分,它們指導著程序如何在不同的情況下執行相應的指令。Python作為一種高級編程語言,也擁有三種基本的控制結構:順序結構、選擇結構和循環結構。 一…

    編程 2025-04-29
  • 使用Java將JSON寫入HDFS

    本篇文章將從以下幾個方面詳細闡述Java將JSON寫入HDFS的方法: 一、HDFS簡介 首先,先來了解一下Hadoop分散式文件系統(HDFS)。HDFS是一個可擴展性高的分散式…

    編程 2025-04-29
  • 使用Go-Redis獲取Redis集群內存使用率

    本文旨在介紹如何使用Go-Redis獲取Redis集群的內存使用率。 一、Go-Redis簡介 Go-Redis是一個用於連接Redis伺服器的Golang客戶端。它支持Redis…

    編程 2025-04-28
  • Kong 使用第三方的go插件

    本文將針對Kong使用第三方的go插件進行詳細闡述。首先,我們解答下標題的問題:如何使用第三方的go插件?我們可以通過編寫插件來達到此目的。 一、插件架構介紹 Kong的插件系統采…

    編程 2025-04-28
  • Go中struct的初始化

    本文將從多個方面詳細闡述Go中struct的初始化方式,包括使用字面量初始化、使用new函數初始化以及使用構造函數等。通過本文的介紹,讀者能夠更深入的了解Go中struct的初始化…

    編程 2025-04-28
  • 如何使用Newtonsoft datatable轉Json

    Newtonsoft DataTable 是一個基於.NET的JSON框架,也是一個用於序列化和反序列化JSON的強大工具。 在本文中,我們將學習如何使用Newtonsoft Da…

    編程 2025-04-28

發表回復

登錄後才能評論