メモリ内のすべてのオブジェクトをロードせずに MarshalJSON を使用して大規模なデータ ストリームをエンコードする
ロードせずに json.Encoder を使用して大規模なデータ ストリームをエンコードしたいすべてを一度にメモリに書き込むのはよくある問題です。残念ながら、encoding/json パッケージはこれを直接サポートしていません。
現在の回避策
あなたが述べたように、現在の解決策は、JSON 文字列を手動で構築することです。あなた自身。これには、データがストリームから利用可能になるにつれて、JSON 構造を部分的に書き込むことが含まれます。これは効率的なアプローチですが、面倒でエラーが発生しやすい可能性があります。
提案されたパッチ
このプロセスを改善するには、encoding/json パッケージを変更します。具体的には、encoding/json/encode.go のreflectValueQuoted 関数を変更して、チャネルを配列のように処理することができます。これにより、チャネルから JSON 出力へのデータの直接ストリーミングが可能になります。
reflectValueQuoted:
case reflect.Array:
e.WriteByte('[')
n := v.Len()
for i := 0; i 0 {
e.WriteByte(',')
}
e.reflectValue(v.Index(i))
}
e.WriteByte(']')
// Add the following case for channels:
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(']')
パッチの利点
このパッチにより、すべてのオブジェクトをメモリにロードせずに大規模なデータ ストリームをエンコードすることがはるかに簡単になります。また、手動で文字列を連結する必要がなくなり、エラーのリスクが軽減され、コードの可読性が向上します。
結論
提案されたパッチは現在のパッチの一部ではありませんが、エンコード/json パッケージを使用すると、JSON データのストリーミングをより効率的かつ便利にする可能性のある改善が見られます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3