← 中文资源

简体中文版本

用编码器流式输出 JSON 数组

从通道逐条读取记录,用 json.Encoder 写入带缓冲的 Writer,边写边输出方括号与逗号,避免一次性构造完整切片。

阅读英文原文

功能说明

StreamJSONArray 从通道逐条读取 Row,用 json.Encoder 写入带缓冲的 io.Writer,边读边输出 JSON 数组。函数先写 [,之后每条记录前补逗号,最后写 ] 并 Flush。这样不需要先把所有记录聚合成切片,内存占用只与单条记录和缓冲区有关。

关键代码

buffered := bufio.NewWriter(w)
encoder := json.NewEncoder(buffered)
encoder.SetEscapeHTML(false)
buffered.WriteString("[")
...
if err := encoder.Encode(row); err != nil {
	return err
}
...
return buffered.Flush()

Encoder.Encode 会在每个值后追加换行;JSON 允许值之间出现空白,所以换行出现在逗号前仍然合法。

使用注意

  • 必须检查每次写入与编码的错误,否则客户端可能收到截断的 JSON。
  • SetEscapeHTML(false) 保留 <、> 等字符,输出更易读,但嵌入 HTML 时要防止 XSS。
  • 缓冲区大小固定,写入方仍需及时消费;HTTP 场景应在返回前设置 Content-Type: application/json。
  • 通道由调用方关闭,函数只负责读取,避免重复关闭。
  • 出错时已经写出的内容无法回滚,客户端应通过连接中断或状态码感知失败。

验证方式

运行示例应打印一个包含三条记录的合法 JSON 数组,记录之间允许换行。可以把输出重定向到文件后用 python -m json.tool 解析;把通道中的记录数增加,观察内存不随总量增长。