一、什麼是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