GO語言開發之JSON處理 編碼JSON 與 解碼JSON
阿新 • • 發佈:2019-02-14
1. json簡介
JSON (JavaScript Object Notation)是一種比XML更輕量級的資料交換格式,在易於人們閱讀和編寫的同時,也易於程式解析和生成。儘管JSON是JavaScript的一個子集,但JSON採用完全獨立於程式語言的文字格式,且表現為鍵/值對集合的文字描述形式(類似一些程式語言中的字典結構),這使它成為較為理想的、跨平臺、跨語言的資料交換語言。
開發者可以用 JSON 傳輸簡單的字串、數字、布林值,也可以傳輸一個數組,或者一個更復雜的複合結構。在 Web 開發領域中, JSON被廣泛應用於 Web 服務端程式和客戶端之間的資料通訊。
Go語言內建對JSON的支援。使用Go語言內建的encoding/json 標準庫,開發者可以輕鬆使用Go程式生成和解析JSON格式的資料。
2. json編碼
使用json.Marshal()函式可以對一組資料進行JSON格式的編碼。
func Marshal(v interface{}) ([]byte, error)
MarshalIndent 很像 Marshal,只是用縮排對輸出進行格式化
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)
package main import ( "encoding/json" "fmt" ) type IT struct{ Name string Company string Subjects []string IsOk bool Price float64 } func main() t1 := IT{"Ternence Hsu","Google", []string{"Go", "C++", "Python", "Test"}, true,666.666} //生成一段JSON 格式的文字 //如果編碼成功, err 將賦於零值 nil,變數b 將會是一個進行JSON 格式化之後的[]byte 型別 b1, err := json.Marshal(t1) if err != nil { fmt.Println("json err:", err) } // 用縮排對輸出進行格式化 b2, err := json.MarshalIndent(t1, "", " ") if err != nil { fmt.Println("json err:", err) } fmt.Println(string(b1)) fmt.Println(string(b2)) } /* b1輸出結果: {"Name":"Ternence Hsu","Company":"Google","Subjects":["Go","C++","Python","Test"],"IsOk":true,"Price":666.666} b2 輸出結果: { "Name":"Ternence Hsu", "Company":"Google", "Subjects":[ "Go", "C++", "Python", "Test" ], "IsOk":true, "Price":666.666 } */
3. json解碼
使用json.Unmarshal()函式將JSON格式的文字解碼為Go裡面預期的資料結構
func Unmarshal(data []byte, v interface{}) error
package main import ( "encoding/json" "fmt" ) type IT struct { Name string `json:"name"` Company string `json:"company"` Subjects []string `json:"subjects"` IsOk bool `json:"isok"` Price float64 `json:"price"` } func main() { b := []byte(`{ "name": "Ternence Hsu", "company": "Google", "subjects": [ "Go", "C++", "Python", "Test" ], "isok": true, "price": 666.666 }`) var t IT err := json.Unmarshal(b, &t) if err != nil { fmt.Println("json err:", err) } fmt.Println(t) //執行結果:{Ternence Hsu Google [Go C++ Python Test] true 666.666} //只想要Subjects欄位 type IT2 struct { Subjects []string `json:"subjects"` } var t2 IT2 err = json.Unmarshal(b, &t2) if err != nil { fmt.Println("json err:", err) } fmt.Println(t2) //執行結果:{[Go C++ Python Test]} }