json的全稱是Javascript object notation, 中文全稱:js對象表示法。在序列化和反序列化的協議中,有:json、xml、yaml、protocol buffer等。其中json是先後端API契約數據的主要傳輸形式。json支持數值、布爾值、數組和對象四種數據類型。經過這四種數據類型,能夠構建複雜的數據模型。github
在Go語言中,經過json標準庫,能夠進行數據的序列化和反序列化。它能夠序列化map,結構體、數組和slice動態數組、內置的基本數據類型。golang
咱們在這裏舉三個例子,說明json的使用方法,初學者可能常常只用到一種結構體對象接收和發送數據。json
type Person struct { Name string `json:"name"` Age int `json:"age"` } func main() { var ( newPer Person bts []byte ) per:=Person{ Name: "Lily", Age: 29, } // 序列化 if bts, err = json.Marshal(per); err !=nil{ log.Fatal(err.Error()) return } if err = json.Unmarshal(bts, &newPer); err !=nil{ log.Fatal(err.Error()) return } fmt.Println(newPer) }
func main() { var ( smap = map[string]int{ "Age": 28, "Sex": 1, "Floor": 12, } newSmap = make(map[string]int) bts []byte ) if bts, err = json.Marshal(smap); err !=nil { log.Fatal(err.Error()) return } if err = json.Umarshal(bts, &newSmap); err !=nil { log.Fatal(err.Error()) return } fmt.Println(newSmap) }
func main() { var ( ages []int = []int{23, 20, 28, 25, 30} bts []byte err error newAges = make([]int, len(ages)) ) if bts, err = json.Marshal(ages); err != nil { fmt.Println(err.Error()) return } if err = json.Unmarshal(bts, &newAges); err != nil { fmt.Println(err.Error()) return } fmt.Println("new ages: ", newAges) return }
初學者對結構體的json序列化和反序列化比較清楚,對後兩種可能不多用,也不會用。後端
這裏還要說明一個結構體時,有時候我會用到的特性,結構體的json支持的標籤值特性omitempty,例如:數組
type Person struct { Name string `json:"name,omitempty"` Age int `json:"age"` }
它表示,當函數omitempty的標籤值時,它所對應的結構體的數據元素值若是是零值,則它不會輸出。那就是說若是服務端返回的結構體數據中的某個元素爲空時,不返回給前端這個元素,就能夠使用omitempty的json標籤值屬性。函數
在這裏給你們提供一個滴滴公司的一位高級工程師taowen寫的json解析庫,世界上最快的。github地址:jsoniter。學習