XML 數據格式
對於如下的XML:
<Person> <FirstName>Laura</FirstName> <LastName>Lynn</LastName> </Person>
和 JSON 的方式一樣,XML 數據可以序列化為結構,或者從結構反序列化為 XML 數據;
encoding/xml 包實現了一個簡單的 XML 解析器(SAX),用來解析 XML 數據內容。下面的例子說明如何使用解析器:
示例 xml.go:
// xml.go package main import ( "encoding/xml" "fmt" "strings" ) var t, token xml.Token var err error func main() { input := "<Person><FirstName>Laura</FirstName><LastName>Lynn</LastName></Person>" inputReader := strings.NewReader(input) p := xml.NewDecoder(inputReader) for t, err = p.Token(); err == nil; t, err = p.Token() { switch token := t.(type) { case xml.StartElement: name := token.Name.Local fmt.Printf("Token name: %s\n", name) for _, attr := range token.Attr { attrName := attr.Name.Local attrValue := attr.Value fmt.Printf("An attribute is: %s %s\n", attrName, attrValue) // ... } case xml.EndElement: fmt.Println("End of token") case xml.CharData: content := string([]byte(token)) fmt.Printf("This is the content: %v\n", content) // ... default: // ... } } }
輸出:
Token name: Person
Token name: FirstName
This is the content: Laura
End of token
Token name: LastName
This is the content: Lynn
End of token
End of token
包中定義了若干 XML 標簽類型:StartElement,Chardata(這是從開始標簽到結束標簽之間的實際文本),EndElement,Comment,Directive 或 ProcInst。
包中同樣定義了一個結構解析器:NewParser
方法持有一個 io.Reader(這里具體類型是 strings.NewReader)並生成一個解析器類型的對象。還有一個 Token()
方法返回輸入流里的下一個 XML token。在輸入流的結尾處,會返回(nil,io.EOF)
XML 文本被循環處理直到 Token()
返回一個錯誤,因為已經到達文件尾部,再沒有內容可供處理了。通過一個 type-switch 可以根據一些 XML 標簽進一步處理。Chardata 中的內容只是一個 []byte,通過字符串轉換讓其變得可讀性強一些。
JSON 數據格式
我們都比較熟悉 XML 格式(參閱 12.10);但有些時候 JSON(JavaScript Object Notation,參閱 http://json.org)被作為首選,主要是由於其格式上非常簡潔。通常 JSON 被用於 web 后端和瀏覽器之間的通訊,但是在其它場景也同樣的有用。
這是一個簡短的 JSON 片段:(與上面XML同義)
{ "Person": { "FirstName": "Laura", "LastName": "Lynn" } }
盡管 XML 被廣泛的應用,但是 JSON 更加簡潔、輕量(占用更少的內存、磁盤及網絡帶寬)和更好的可讀性,這也使它越來越受歡迎。
示例 json.go:
// 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, 0666) defer file.Close() enc := json.NewEncoder(file) err := enc.Encode(vc) if err != nil { log.Println("Error in encoding json") } }
- 目錄
- 上一節:Json 數據格式
- 下一節:用 Gob 傳輸數據
轉載自:https://github.com/unknwon/the-way-to-go_ZH_CN/blob/master/eBook/12.10.md