在不加载整个对象的情况下封送 JSON 流
您的目标是对大型数据流进行编码,而不将整个流保留在内存中。虽然 JSON 是一种常见的数据格式,但标准库的 json.Marshaler 接口并未提供实现此目的的直接方法。
自定义字符串构建
目前,您可以使用 WriteString 手动构造 JSON 字符串,鉴于缺乏内置功能,这是一种合理的方法。这个方法可以确保你一次只处理小块数据。
修改encoding/json
如果你愿意修改encoding/json包,你可以修补reflectValueQuoted函数以将通道作为数组处理。这将允许您遍历通道并在它们变得可用时对其值进行编码,而无需缓冲整个流。
代码补丁示例
这是编码的修改版本/您可以使用的 json 代码:
<code class="go">// Inside switch: case reflect.Chan: e.WriteByte('[') i := 0 for { x, ok := v.Recv() if !ok { break } if i > 0 { e.WriteByte(',') } e.reflectValue(x) i++ } e.WriteByte(']')</code>
结论
在不加载整个数据的情况下编组 JSON 流的唯一当前选项是手动构造字符串,因为您'当前正在做或修改encoding/json包。修改包需要对内部实现有一定的了解,应该慎重考虑。
以上是如何在不将整个对象加载到内存中的情况下编组 JSON 流?的详细内容。更多信息请关注PHP中文网其他相关文章!