功能说明
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 解析;把通道中的记录数增加,观察内存不随总量增长。