清華尹成帶你實戰GO案例(10)Go JSON支援
Go JSON支援
Go內建了對JSON資料的編碼和解碼,這些資料的型別包括內建資料型別和自定義資料型別。
執行結果
true
1
2.34
"gopher"
["apple","peach","pear"]
{"apple":5,"lettuce":7}
{"Page":1,"Fruits":["apple","peach","pear"]}
{"page":1,"fruits":["apple","peach","pear"]}
map[num:6.13 strs:[a b]]
6.13
a
&{1 [apple peach]}
apple
{"apple":5,"lettuce":7}
Go內建了對JSON資料的編碼和解碼,這些資料的型別包括內建資料型別和自定義資料型別。
package main
import "encoding/json"
import "fmt"
import "os"
// 我們使用兩個結構體來演示自定義資料型別的JSON資料編碼和解碼。
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))
// 這裡是將切片和字典編碼為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))
// 你可以使用tag來自定義編碼後JSON鍵的名稱
res2D := &Response2{
Page: 1,
Fruits: []string{"apple", "peach", "pear"}}
res2B, _ := json.Marshal(res2D)
fmt.Println(string(res2B))
fmt.Println(string(res2B))
// 現在我們看看解碼JSON資料為Go數值
byt := []byte(`{"num":6.13,"strs":["a","b"]}`)
// 我們需要提供一個變數來儲存解碼後的JSON資料,這裡
// 的`map[string]interface{}`將以Key-Value的方式
// 儲存解碼後的資料,Value可以為任意資料型別
var dat map[string]interface{}
// 解碼過程,並檢測相關可能存在的錯誤
if err := json.Unmarshal(byt, &dat); err != nil {
panic(err)
}
fmt.Println(dat)
// 為了使用解碼後map裡面的資料,我們需要將Value轉換為
// 它們合適的型別,例如我們將這裡的num轉換為期望的float64
num := dat["num"].(float64)
fmt.Println(num)
// 訪問巢狀的資料需要一些型別轉換
strs := dat["strs"].([]interface{})
str1 := strs[0].(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])
// 上面的例子中,我們使用bytes和strings來進行原始資料和JSON資料
// 之間的轉換,我們也可以直接將JSON編碼的資料流寫入`os.Writer`
// 或者是HTTP請求回覆資料。
enc := json.NewEncoder(os.Stdout)
d := map[string]int{"apple": 5, "lettuce": 7}
enc.Encode(d)
}
執行結果
true
1
2.34
"gopher"
["apple","peach","pear"]
{"apple":5,"lettuce":7}
{"Page":1,"Fruits":["apple","peach","pear"]}
{"page":1,"fruits":["apple","peach","pear"]}
map[num:6.13 strs:[a b]]
6.13
a
&{1 [apple peach]}
apple
{"apple":5,"lettuce":7}
網址:http://www.qukuailianxueyuan.io/
欲領取造幣技術與全套虛擬機器資料
區塊鏈技術交流QQ群:756146052 備註:CSDN
尹成學院微信:備註:CSDN
相關文章
- 清華尹成帶你實戰GO案例(28)Go 方法Go
- 清華尹成帶你實戰GO案例(35)Go 互斥Go
- 清華尹成帶你實戰GO案例(38)Go 介面Go
- 清華尹成帶你實戰GO案例(46)Go 排序Go排序
- 清華尹成帶你實戰GO案例(47)Go 切片Go
- 清華尹成帶你實戰GO案例(2) Go 字典Go
- 清華尹成帶你實戰GO案例(7)Go DeferGo
- 清華尹成帶你實戰GO案例(7)Go ExitGo
- 清華尹成帶你實戰GO案例(12)Go PanicGo
- 清華尹成帶你實戰GO案例(22)Go常量Go
- 清華尹成帶你實戰GO案例(29)Go 工作池Go
- 清華尹成帶你實戰GO案例(37)Go 集合功能Go
- 清華尹成帶你實戰GO案例(49)Go 時間Go
- 清華尹成帶你實戰GO案例(52)Go數值Go
- 清華尹成帶你實戰GO案例(54)Go 陣列Go陣列
- 清華尹成帶你實戰GO案例(57)Go通道方向Go
- 清華尹成帶你實戰GO案例(63)Go 指標Go指標
- 清華尹成帶你實戰GO案例(8)Go for迴圈Go
- 清華尹成帶你實戰GO案例(11)Go Line FiltersGoFilter
- 清華尹成帶你實戰GO案例(17) Go URL解析Go
- 清華尹成帶你實戰GO案例(19)Go變數Go變數
- 清華尹成帶你實戰GO案例(23)Go 超時Go
- 清華尹成帶你實戰GO案例(30)Go 關閉通道Go
- 清華尹成帶你實戰GO案例(39)Go 結構體Go結構體
- 清華尹成帶你實戰GO案例(40)Go 程式觸發Go
- 清華尹成帶你實戰GO案例(41)Go 程式執行Go
- 清華尹成帶你實戰GO案例(50)Go 時間戳Go時間戳
- 清華尹成帶你實戰GO案例(53)Go 數字解析Go
- 清華尹成帶你實戰GO案例(55)Go 隨機數Go隨機
- 清華尹成帶你實戰GO案例(58)Go通道緩衝Go
- 清華尹成帶你實戰GO案例(5)Go 自定義排序Go排序
- 清華尹成帶你實戰GO案例(13)Go range函式Go函式
- 清華尹成帶你實戰GO案例(16)Go Switch語句Go
- 清華尹成帶你實戰GO案例(20)Go 遍歷通道Go
- 清華尹成帶你實戰GO案例(25)Go 打點器Go
- 清華尹成帶你實戰GO案例(27)Go 讀取檔案Go
- 清華尹成帶你實戰GO案例(31)Go 函式定義Go函式
- 清華尹成帶你實戰GO案例(33)Go 函式回撥Go函式