如何將 Go 結構體轉換為 JSON
Suraj Joshi
2023年1月30日
2020年6月9日
JSON 是一種輕量級語言獨立格式,用於儲存和傳輸資料。在 Go 中,我們有 encoding/json
包,其中包含許多用於 JSON 相關操作的內建方法。我們可以使用封送處理將結構資料轉換為 JSON。
將 Go 結構體轉換為 JSON
marshal
方法接收結構物件並返回編碼資料的位元組片,我們可以在 Go 中將其更改為 JSON。
package main
import (
"encoding/json"
"fmt"
)
type Employee struct {
Name string `json:"empname"`
Number int `json:"empid"`
}
func main() {
employee_1 := &Employee{Name: "Dixya Lhyaho", Number: 10}
e, err := json.Marshal(employee_1)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(e))
}
輸出:
{"empname":"Dixya Lhyaho","empid":10}
如果將 Number
屬性更改為 number
,則編組過程中將忽略 number
,因為 json/encoding
包看不到它。
package main
import (
"encoding/json"
"fmt"
)
type Employee struct {
Name string `json:"empname"`
number int `json:"empid"`
}
func main() {
employee_1 := &Employee{Name: "Dixya Lhyaho", number: 10}
e, err := json.Marshal(employee_1)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(e))
}
輸出:
{"empname":"Dixya Lhyaho"}
在 Go 中將巢狀結構轉換為 JSON
讓我們用巢狀結構定義一個更復雜的結構。在結構的定義內,我們定義了 JSON 標記,這些標記將結構的欄位直接對映到封送處理的 JSON 中的欄位。
package main
import (
"encoding/json"
"fmt"
)
type Employee struct {
Position string `json:"position"`
Name Name `json:"name"`
}
type Name struct {
FirstName string `json:"firstname"`
Surname string `json:"surname"`
}
func main() {
name := Name{FirstName: "Dikxya", Surname: "Lhyaho"}
employee := Employee{Position: "Senior Developer", Name: name}
byteArray, err := json.Marshal(employee)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(byteArray))
}
輸出:
{"position":"Senior Developer","name":{"firstname":"Dikxya","surname":"Lhyaho"}}
Go 中結構體到 JSON 轉換的縮排
我們可以使用 json.MarshalIndent()
函式代替 json.Marshal()
函式以更易讀的格式列印 JSON。我們將兩個附加引數,字首字串和縮排字串傳遞給 MarshalIndent
。
package main
import (
"encoding/json"
"fmt"
)
type Employee struct {
Position string `json:"position"`
Name Name `json:"name"`
}
type Name struct {
FirstName string `json:"firstname"`
Surname string `json:"surname"`
}
func main() {
name := Name{FirstName: "Dikxya", Surname: "Lhyaho"}
employee := Employee{Position: "Senior Developer", Name: name}
byteArray, err := json.MarshalIndent(employee, "", " ")
if err != nil {
fmt.Println(err)
}
fmt.Println(string(byteArray))
}
輸出:
{
"position": "Senior Developer",
"name": {
"firstname": "Dikxya",
"surname": "Lhyaho"
}
}
Author: Suraj Joshi
Suraj Joshi is a backend software engineer at Matrice.ai.
LinkedIn