如何将对象流式传输到压缩的 json?

Posted

技术标签:

【中文标题】如何将对象流式传输到压缩的 json?【英文标题】:how to stream object to gzipped json? 【发布时间】:2019-08-16 06:38:40 【问题描述】:

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

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

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

有什么方法可以流式传输 payload 对象的编组,使其首先被 gzip 压缩?

【问题讨论】:

golang.org/pkg/encoding/json/#Encoder 将帮助 blog.golang.org/json-and-go Streaming Encoders and Decoders 【参考方案1】:

是的,您可以使用 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]

【讨论】:

以上是关于如何将对象流式传输到压缩的 json?的主要内容,如果未能解决你的问题,请参考以下文章

WCF REST 服务流式传输 JSON 对象

将多个 TObject 流式传输到 TMemoryStream

使用 GSON 的 JsonReader 流式传输 Json 文件时,您可以将对象转储为字符串吗?

使用java将json数据流式传输到Bigquery中。不使用作业加载数据

如何使用createWriteStream将JSON流式传输到BigQuery表?

使用java.Without使用作业加载数据,将json数据流式传输到Bigquery