{ "Person": { "FirstName": "Laura", "LastName": "Lynn" } }儘管 XML 被廣泛的應用,但是 JSON 更加簡潔、輕量(占用更少的記憶體、磁碟及網路頻寬)和更好的可讀性,這也說明它越來越受歡迎。
// json.go package main import ( "encoding/json" "fmt" "log" "os" ) type Address struct { Type string City string Country string } type VCard struct { FirstName string LastName string Addresses []*Address Remark string } func main() { pa := &Address{"private", "Aartselaar", "Belgium"} wa := &Address{"work", "Boom", "Belgium"} vc := VCard{"Jan", "Kersschot", []*Address{pa, wa}, "none"} // fmt.Printf("%v: n", vc) // {Jan Kersschot [0x126d2b80 0x126d2be0] none}: // JSON format: js, _ := json.Marshal(vc) fmt.Printf("JSON format: %s", js) // using an encoder: file, _ := os.OpenFile("vcard.json", os.O_CREATE|os.O_WRONLY, 0) defer file.Close() enc := json.NewEncoder(file) err := enc.Encode(vc) if err != nil { log.Println("Error in encoding json") } }json.Marshal() 的函數簽名是
func Marshal(v interface{}) ([]byte, error)
,下面是資料編碼後的 JSON 文字(實際上是一個 []bytes):{ "FirstName": "Jan", "LastName": "Kersschot", "Addresses": [{ "Type": "private", "City": "Aartselaar", "Country": "Belgium" }, { "Type": "work", "City": "Boom", "Country": "Belgium" }], "Remark": "none" }出於安全考慮,在 web 應用中最好使用
json.MarshalforHTML()
函數,其對資料執行 HTML 轉碼,所以文字可以被安全地嵌在 HTML <script> 標籤中。func Unmarshal(data []byte, v interface{}) error
把 JSON 解碼為資料結構。b == []byte({"Name": "Wednesday", "Age": 6, "Parents": ["Gomez", "Morticia"]})
不用理解這個資料的結構,我們可以直接使用 Unmarshal 把這個資料編碼並儲存在介面值中:
var f interface{}
err := json.Unmarshal(b, &f)
map[string]interface{} { "Name": "Wednesday", "Age": 6, "Parents": []interface{} { "Gomez", "Morticia", }, }要存取這個資料,我們可以使用型別斷言。
m := f.(map[string]interface{})
我們可以通過 for range 語法和 type switch 來存取其實際型別:for k, v := range m { switch vv := v.(type) { case string: fmt.Println(k, "is string", vv) case int: fmt.Println(k, "is int", vv) case []interface{}: fmt.Println(k, "is an array:") for i, u := range vv { fmt.Println(i, u) } default: fmt.Println(k, "is of a type I don’t know how to handle") } }通過這種方式,可以處理未知的 JSON 資料,同時可以確保型別安全。
type FamilyMember struct { Name string Age int Parents []string }並對其反序列化:
var m FamilyMember err := json.Unmarshal(b, &m)程式實際上是分配了一個新的切片。這是一個典型的反序列化參照型別(指標、切片和 map)的例子。
func NewDecoder(r io.Reader) *Decoder
func NewEncoder(w io.Writer) *Encoder
func NewDecoder(r io.Reader) *Decoder
func (dec *Decoder) Decode(v interface{}) error