func ExampleDecoder() { const jsonStream = ` {"Name": "Ed", "Text": "Knock knock."} {"Name": "Sam", "Text": "Who's there?"} {"Name": "Ed", "Text": "Go fmt."} {"Name": "Sam", "Text": "Go fmt who?"} {"Name": "Ed", "Text": "Go fmt yourself!"} ` type Message struct { Name, Text string } dec := json.NewDecoder(strings.NewReader(jsonStream)) for { var m Message if err := dec.Decode(&m); err == io.EOF { break } else if err != nil { log.Fatal(err) } fmt.Printf("%s: %s\n", m.Name, m.Text) } // Output: // Ed: Knock knock. // Sam: Who's there? // Ed: Go fmt. // Sam: Go fmt who? // Ed: Go fmt yourself! }
如果JSON
数据的载体是打开的文件或者HTTP
请求体这种数据流(他们都是io.Reader
的实现),我们不必把JSON
数据读取出来后再去调用encode/json
包的UnMarshall
方法,包提供的Decode
方法可以完成读取数据流并解析JSON
数据最后填充变量的操作。