首頁 >後端開發 >Golang >golang json 類型轉換

golang json 類型轉換

王林
王林原創
2023-05-13 11:09:071034瀏覽

在 Golang 中,JSON 是一種重要的資料格式,因為其可以方便的進行資料傳輸和儲存。在處理 JSON 資料時,型別轉換是非常常見的操作,本文將介紹 Golang 中的 JSON 類型轉換。

JSON 資料類型

在進行 JSON 類型轉換之前,我們需要了解 JSON 中的資料類型。 JSON 資料型別與Golang 中的資料型別不完全對應,JSON 中有下列6 種資料型別:

  • 物件( Object ):由大括號{} 包圍,表示鍵值對集合,鍵值對之間使用逗號隔開。
  • 數組( Array ):由中括號 [] 包圍,表示值的有序列表,值之間使用逗號隔開。
  • 字串( String ):由雙引號" 包圍,表示字串值。
  • 數值(Number ):表示數字值,可以為整數或浮點數。
  • #布林( Boolean ):表示布林值true 或false。
  • 空值( Null ):表示空物件或空值。

在Golang 中,我們可以使用下列類型來表示JSON 資料型別:

  • 物件:map[string]interface{}
  • 陣列:[]interface{}
  • 字串:string
  • #數值:float64
  • 布林:bool
  • 空值:nil

JSON 解析與編碼

在進行JSON 型別轉換之前,首先需要了解JSON 解析與編碼。

JSON 解析

透過encoding/json 套件中的Decode 方法,可以將字串或字節數組解析為JSON 對象。例如:

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name    string
    Age     int
    Address string
}

func main() {
    jsonStr := `{"Name": "Tom", "Age": 18, "Address": "Beijing"}`
    var p Person
    err := json.Unmarshal([]byte(jsonStr), &p)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(p.Name, p.Age, p.Address)
}

上述程式碼中,Unmarshal 方法將JSON 字串解析為Person 對象,當然如果我們只想解析為map[string]interface{}[]interface{} 等基礎資料類型也是可以的。

JSON 編碼

##透過

encoding/json 套件中的Encode 方法,可以將一個JSON 物件編碼為字串或位元組數組。例如:

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name    string
    Age     int
    Address string
}

func main() {
    p := Person{Name: "Tom", Age: 18, Address: "Beijing"}
    jsonString, err := json.Marshal(p)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(jsonString))
}

在上述程式碼中,

Marshal 方法將Person 物件編碼為JSON 字串。當然,如果我們只想編碼map[string]interface{}[]interface{ } 等基礎資料類型也是可以的。

JSON 類型轉換

在解析JSON 資料後,我們可以將JSON 物件轉換為Golang 中的基礎資料類型,例如

intstringbool 等,也可以將JSON 數組轉換為Golang 中的數組,或是將JSON 物件轉換為Golang 中的結構體。

將JSON 數字轉換為int 和float64

將JSON 中的數字轉換為Golang 中的資料型別有兩種常用方式,分別是

float64()int()。例如:

import (
    "encoding/json"
    "fmt"
)

func main() {
    jsonStr := `{"float": 1.23, "int": 456}`
    var data map[string]interface{}
    err := json.Unmarshal([]byte(jsonStr), &data)
    if err != nil {
        fmt.Println(err)
        return
    }

    floatValue := data["float"].(float64)
    intValue := int(data["int"].(float64))
    fmt.Println(floatValue, intValue)
}

上述程式碼中,我們先將JSON 字串解析為

map[string]interface{} 類型的data 對象,然後透過斷言將data 物件中的float 轉換為float64 類型的floatValueint 轉換為int 類型的intValue

將 JSON 字串轉換為 string

將 JSON 中的字串轉換為 Golang 中的

string 類型很簡單,直接透過斷言即可。例如:

import (
    "encoding/json"
    "fmt"
)

func main() {
    jsonStr := `{"name": "Tom"}`
    var data map[string]interface{}
    err := json.Unmarshal([]byte(jsonStr), &data)
    if err != nil {
        fmt.Println(err)
        return
    }

    name := data["name"].(string)
    fmt.Println(name)
}

上述程式碼中,我們將JSON 字串解析為

map[string]interface{} 類型的data 對象,然後透過斷言將data 物件中的name 轉換為string 類型的name

將JSON 陣列轉換為[]interface{}

將JSON 中的陣列轉換為Golang 中的

[]interface{} 類型很簡單,直接透過斷言即可。例如:

import (
    "encoding/json"
    "fmt"
)

func main() {
    jsonStr := `["Tom", 18, 1.23]`
    var data []interface{}
    err := json.Unmarshal([]byte(jsonStr), &data)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(data)
}

上述程式碼中,我們將JSON 字串解析為

[]interface{} 類型的data 數組,透過輸出可以看到 data 陣列的每個元素都被正確解析了。

將JSON 物件轉換為map[string]interface{}

將JSON 中的物件轉換為Golang 中的

map[string]interface{} 類型也很簡單,直接透過斷言即可。例如:

import (
    "encoding/json"
    "fmt"
)

func main() {
    jsonStr := `{"name": "Tom", "age": 18}`
    var data map[string]interface{}
    err := json.Unmarshal([]byte(jsonStr), &data)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(data)
}

上述程式碼中,我們將JSON 字串解析為

map[string]interface{} 類型的data 對象,透過輸出可以看到data 物件中包含了兩個鍵值對nameage

將 JSON 物件轉換為結構體

將 JSON 中的物件轉換為 Golang 中的結構體需要指定結構體的字段,然後透過斷言將結構體字段值進行賦值。例如:

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name    string
    Age     int
    Address string
}

func main() {
    jsonStr := `{"Name": "Tom", "Age": 18, "Address": "Beijing"}`
    var data map[string]interface{}
    err := json.Unmarshal([]byte(jsonStr), &data)
    if err != nil {
        fmt.Println(err)
        return
    }

    p := Person{
        Name:    data["Name"].(string),
        Age:     int(data["Age"].(float64)),
        Address: data["Address"].(string),
    }
    fmt.Println(p)
}

上述程式碼中,我們將JSON 字串解析為

map[string]interface{} 類型的data 對象,然後透過斷言將data 物件中的鍵值對分別賦值給結構體Person 的欄位。

總結

Golang 中的 JSON 類型轉換非常常見,因此在進行 JSON 資料處理時應該對其進行充分的了解。本文透過介紹 Golang 中 JSON 的資料型態、JSON 解析與編碼方法及 JSON 型別轉換等內容,希望能幫助讀者更好的應用 Golang 處理 JSON 資料。

以上是golang json 類型轉換的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn