如何将对象流式传输到压缩的 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-goStreaming Encoders and Decoders
【参考方案1】:
是的,您可以使用 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]
【讨论】:
以上是关于如何将对象流式传输到压缩的 json?的主要内容,如果未能解决你的问题,请参考以下文章
将多个 TObject 流式传输到 TMemoryStream
使用 GSON 的 JsonReader 流式传输 Json 文件时,您可以将对象转储为字符串吗?
使用java将json数据流式传输到Bigquery中。不使用作业加载数据