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

pde*_*eva 6 encoding json stream go

当前将对象转换为json和gzip的方法是:

jsonBytes, _ := json.Marshal(payload)
//gzip json
var body bytes.Buffer
g := gzip.NewWriter(&body)
g.Write(jsonBytes)
g.Close()

Run Code Online (Sandbox Code Playgroud)

这将产生一个中间的大字节缓冲区jsonBytes,其唯一目的是随后将其转换为gzip缓冲区。

有什么方法可以流化payload对象的编组,以便首先压缩它吗?

icz*_*cza 7

是的,您可以用于json.Encoderjson.Decoder式传输JSON 输出,并且类似地用于解码流式JSON输入。他们采用any io.Writer并将io.ReaderJSON结果写入/读取,包括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)
}
Run Code Online (Sandbox Code Playgroud)

为了验证它是否有效,我们可以通过以下方式对其进行解码:

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)
Run Code Online (Sandbox Code Playgroud)

将输出(在Go Playground上尝试):

Decoded: map[one:1 two:2]
Run Code Online (Sandbox Code Playgroud)