目前将对象转换为json和gzip的方法是:
jsonBytes, _ := json.Marshal(payload)
//gzip json
var body bytes.Buffer
g := gzip.NewWriter(&body)
g.Write(jsonBytes)
g.Close()
这会产生一个中间大字节缓冲区jsonBytes
,其唯一目的是将其转换为gzip缓冲区。
有没有办法流动payload
对象的编组,所以它首先出来gzip?
是的,您可以使用json.Encoder
来传输JSON输出,类似地使用json.Decoder
来解码流式JSON输入。他们将任何io.Writer
和io.Reader
写入JSON结果/读取,包括gzip.Writer
和gzip.Reader
。
例如:
var body bytes.Buffer
w := gzip.NewWriter(&body)
enc := json.NewEncoder(w)
payload := map[string]interface{}{
"one": 1, "two": 2,
}
if err := enc.Encode(payload); err != nil {
panic(err)
}
if err := w.Close(); err != nil {
panic(err)
}
要验证它是否有效,我们可以解码它:
r, err := gzip.NewReader(&body)
if err != nil {
panic(err)
}
dec := json.NewDecoder(r)
payload = nil
if err := dec.Decode(&payload); err != nil {
panic(err)
}
fmt.Println("Decoded:", payload)
哪个会输出(在Go Playground上试试):
Decoded: map[one:1 two:2]