清華尹成帶你實戰GO案例(10)Go JSON支援

尹成發表於2018-05-21
Go JSON支援
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



相關文章