導讀 | json的全名是Javascript object notation, 中文全名:js物件表示法。在序列化和反序列化的協議中,有:json、xml、yaml、protocol buffer等。其中json是前後端API契約資料的主要傳輸形式。 json支援數值、布林值、陣列和物件四種資料類型。透過這四種資料類型,可以建立複雜的資料模型。 |
在Go語言中,我們可以使用json標準函式庫來實現資料的序列化和反序列化。這個函式庫提供了方便的方法來序列化和反序列化map、結構體、陣列、切片和內建的基本資料類型。透過使用json標準函式庫,我們可以輕鬆地將資料轉換為json格式,並在需要時將其解析回原始資料類型。這為我們處理數據提供了很大的便利性。
在這裡,我將舉出三個例子來說明json的使用方法。對於初學者來說,可能經常只使用一種結構體物件來接收和發送資料。下面我們就來看看具體的例子。 1. 使用結構體物件接收資料: ``` type Person struct { Name string `json:"name"` Age int `json:"age"` } func main() { data := `{"name": "Alice", "age": 25}` var p Person err := json.Unmarshal([]byte(data), &p) if err != nil { fmt.Println("解析json失敗:", err) return
#結構體type Person struct {<br>
Name string `json:"name"`<br>#
Age int `json:"age"`<br>#
}
<br>
func main() {<br>
var (<br>
newPer Person<br>
bts []byte<br>
)<br>
per:=Person{<br>
Name: "Lily",<br>
Age: 29,<br>
}<br>
// 序列化<br>
if bts, err = json.Marshal(per); err !=nil{<br>
log.Fatal(err.Error())<br>
return<br>
}
<br>
if err = json.Unmarshal(bts, &newPer); err !=nil{<br>#
log.Fatal(err.Error())<br>
return<br>
}<br>
fmt.Println(newPer)<br>
}
func main() {<br>
var (<br>
smap = map[string]int{<br>#
"Age": 28,<br>
"Sex": 1,<br>
"Floor": 12,<br>
}<br>
newSmap = make(map[string]int)<br>
bts []byte<br>
)<br>
if bts, err = json.Marshal(smap); err !=nil {<br>
log.Fatal(err.Error())<br>
return<br>
}<br>
if err = json.Umarshal(bts, &newSmap); err !=nil {<br>
log.Fatal(err.Error())<br>
return<br>
}<br>
fmt.Println(newSmap)<br>
}
func main() {<br>
var (<br>
ages []int = []int{23, 20, 28, 25, 30}<br>
bts []byte<br>
err error<br>
newAges = make([]int, len(ages))<br>
)<br>
if bts, err = json.Marshal(ages); err != nil {<br>
fmt.Println(err.Error())<br>
return<br>
}<br>
if err = json.Unmarshal(bts, &newAges); err != nil {<br>
fmt.Println(err.Error())<br>
return<br>
}<br>
fmt.Println("new ages: ", newAges)<br>
return<br>
}
初學者對結構體的json序列化和反序列化比較清楚,對後兩種可能很少用,也不會用。
這裡還要說明一個結構體時,有時候我會用到的特性,結構體的json支援的標籤值特性omitempty,例如:
type Person struct {<br>
Name string `json:"name,omitempty"`<br>
Age int `json:"age"`<br>#
}<br>
它表示,當函數omitempty的標籤值時,它所對應的結構體的資料元素值如果是零值,則它不會輸出。那就是說如果服務端回傳的結構體資料中的某個元素為空時,不回傳給前端這個元素,就可以使用omitempty的json標籤值屬性。
在這裡提供大家一個滴滴公司的一位高級工程師taowen寫的json解析庫,世界上最快的。 github位址:jsoniter。
以上是json資料的序列化與反序列化的詳細內容。更多資訊請關注PHP中文網其他相關文章!