// Go 提供內置的 JSON 編解碼支持,包括內置或者自定義類 // 型與 JSON 數據之間的轉化。 package main import "encoding/json" import "fmt" import "os" // 下面我們將使用這兩個結構體來演示自定義類型的編碼和解 // 碼。 type Response1 struct { Page int Fruits []string } type Response2 struct { Page int `json:"page"` Fruits []string `json:"fruits"` } func main() { // 首先我們來看一下基本數據類型到 JSON 字符串的編碼 // // 過程。這裏是一些原子值的例子。 bolB, _ := json.Marshal(true) fmt.Println(string(bolB)) intB, _ := json.Marshal(1) fmt.Println(string(intB)) fltB, _ := json.Marshal(2.34) fmt.Println(string(fltB)) strB, _ := json.Marshal("gopher") fmt.Println(string(strB)) // 這裏是一些切片和 map 編碼成 JSON 數組和對象的例子。 slcD := []string{"apple", "peach", "pear"} slcB, _ := json.Marshal(slcD) fmt.Println(string(slcB)) mapD := map[string]int{"apple": 5, "lettuce": 7} mapB, _ := json.Marshal(mapD) fmt.Println(string(mapB)) // JSON 包可以自動的編碼你的自定義類型。編碼僅輸出可 // 導出的字段,並且默認使用他們的名字作爲 JSON 數據的 // 鍵。 res1D := &Response1{ Page: 1, Fruits: []string{"apple", "peach", "pear"}} res1B, _ := json.Marshal(res1D) fmt.Println(string(res1B)) // 你可以給結構字段聲明標籤來自定義編碼的 JSON 數據鍵 // 名稱。在上面 `Response2` 的定義可以作爲這個標籤這個 // 的一個例子。 res2D := Response2{ Page: 1, Fruits: []string{"apple", "peach", "pear"}} res2B, _ := json.Marshal(res2D) fmt.Println(string(res2B)) // 現在來看看解碼 JSON 數據爲 Go 值的過程。這裏 // 是一個普通數據結構的解碼例子。 byt := []byte(`{"num":6.13,"strs":["a","b"]}`) // 我們需要提供一個 JSON 包可以存放解碼數據的變量。這裏 // 的 `map[string]interface{}` 將保存一個 string 爲鍵, // 值爲任意值的map。 var dat map[string]interface{} // 這裏就是實際的解碼和相關的錯誤檢查。 if err := json.Unmarshal(byt, &dat); err != nil { panic(err) } fmt.Println(dat["num"]) // 爲了使用解碼 map 中的值,我們需要將他們進行適當的類 // 型轉換。例如這裏我們將 `num` 的值轉換成 `float64` // 類型。 num := dat["num"].(float64) fmt.Println(num) // 訪問嵌套的值需要一系列的轉化。 strs := dat["strs"].([]interface{}) str1 := strs[1].(string) fmt.Println(str1) // 我們也可以解碼 JSON 值到自定義類型。這個功能的好處就 // 是可以爲我們的程序帶來額外的類型安全加強,並且消除在 // 訪問數據時的類型斷言。 str := `{"page": 1, "fruits": ["apple", "peach"]}` res := &Response2{} json.Unmarshal([]byte(str), &res) fmt.Println(res) fmt.Println(res.Fruits[0]) // 在上面的例子中,我們經常使用 byte 和 string 作爲使用 // 標準輸出時數據和 JSON 表示之間的中間值。我們也可以和 // `os.Stdout` 一樣,直接將 JSON 編碼直接輸出至 `os.Writer` // 流中,或者作爲 HTTP 響應體。 enc := json.NewEncoder(os.Stdout) d := map[string]int{"apple": 5, "lettuce": 7} enc.Encode(d) }
go基礎語法-json
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.