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

时间:2019-03-25 23:08:46

标签: json go encoding stream

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

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

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

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

1 个答案:

答案 0 :(得分:6)

是的,您可以使用json.Encoder来流化JSON输出,并且类似地json.Decoder来解码流化的JSON输入。他们使用任何io.Writerio.Reader来写入JSON结果到/从中读取,包括gzip.Writergzip.Reader

例如:

import datetime
date_entry = "04/05/2019"
datetime.datetime.strptime(date_entry, "%d/%m/%Y")

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

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)
}

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

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)