如何将对象流式传输到gzipped json?

问题描述 投票:6回答:1

目前将对象转换为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 go encoding stream
1个回答
6
投票

是的,您可以使用json.Encoder来传输JSON输出,类似地使用json.Decoder来解码流式JSON输入。他们将任何io.Writerio.Reader写入JSON结果/读取,包括gzip.Writergzip.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]
© www.soinside.com 2019 - 2024. All rights reserved.