首页  >  文章  >  后端开发  >  如何在不将整个对象加载到内存中的情况下编组 JSON 流?

如何在不将整个对象加载到内存中的情况下编组 JSON 流?

Barbara Streisand
Barbara Streisand原创
2024-10-28 19:16:29347浏览

 How to Marshal JSON Streams Without Loading the Entire Object in Memory?

在不加载整个对象的情况下封送 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn