前面我們介紹了 Marshal 和 Unmarshal 方法,今天再解一下另外兩個 API:Encoder 和 Decoder。
Encoder
Encoder 主要負責將結構對象編碼成 JSON 數據,我們可以調用 json.NewEncoder(io.Writer) 方法獲得一個 Encoder 實例:
// NewEncoder returns a new encoder that writes to w.
func NewEncoder(w io.Writer) *Encoder {
return &Encoder{w: w, escapeHTML: true}
}
io.Writer 是接口類型,包含一個 Write(p []byte) 方法,凡是實現了這個方法的類型實例,都可以作為參數傳遞進去。
接下來我們直接調用 Encoder 實例的 Encode(interface{}) 方法即可完成編碼操作:
func (enc *Encoder) Encode(v interface{}) error {
// ...
}
下面,我們以一個實例來演示這個操作:
package main
import (
"encoding/json"
"os"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
// 如果Child字段為nil 編碼JSON時可忽略
Child *Person `json:"child,omitempty"`
}
func main() {
person := Person{
Name: "John",
Age: 40,
Child: &Person{
Name: "Jack",
Age: 20,
},
}
// File類型實現了io.Writer接口
file, _ := os.Create("person.json")
// 根據io.Writer創建Encoder 然后調用Encode()方法將對象編碼成JSON
json.NewEncoder(file).Encode(&person)
}
上面程序會將結構體對象編碼成 JSON 數據,存入 person.json 文件中,程序運行后,會生成下面文件內容:
{"name":"John","age":40,"child":{"name":"Jack","age":20}}
Decoder
Decoder 主要負責將 JSON 數據解析成結構對象,我們可以調用 json.NewDecoder(io.Reader) 方法獲得一個 Decoder 實例:
// NewDecoder returns a new decoder that reads from r.
func NewDecoder(r io.Reader) *Decoder {
return &Decoder{r: r}
}
同樣地,io.Reader 也是接口類型,包含一個 Read(p []byte) 方法,凡是實現了這個方法的類型實例,都可以作為參數傳遞進去。
獲取到 Decoder 實例之后,我們直接調用它的 Decode(interface{}) 方法即可完成解析操作:
下面我們寫一段程序,讀取 person.json 文件,將文件中的 JOSN 內容解析為對象類型:
package main
import (
"encoding/json"
"fmt"
"os"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
// 如果Child字段為nil 編碼JSON時可忽略
Child *Person `json:"child,omitempty"`
}
func main() {
var person Person
// File類型也實現了io.Reader接口
file, _ := os.Open("person.json")
// 根據io.Reader創建Decoder 然后調用Decode()方法將JSON解析成對象
json.NewDecoder(file).Decode(&person)
fmt.Println(person)
fmt.Println(*person.Child)
}
運行上面程序,控制台打印如下:
{John 40 0xc42000a080}
{Jack 20 <nil>}
