メモリ内のすべてのオブジェクトをロードせずに MarshalJSON を使用して大規模なデータ ストリームをエンコードする
ロードせずに json.Encoder を使用して大規模なデータ ストリームをエンコードしたいすべてを一度にメモリに書き込むのはよくある問題です。残念ながら、encoding/json パッケージはこれを直接サポートしていません。
現在の回避策
現在の解決策は、前述したように、JSON 文字列を手動で構築することです。あなた自身。これには、データがストリームから利用可能になるにつれて、JSON 構造を部分的に書き込むことが含まれます。これは効率的なアプローチですが、面倒でエラーが発生しやすい可能性があります。
提案されたパッチ
このプロセスを改善するには、エンコーディング/json パッケージを変更できます。具体的には、encoding/json/encode.go のreflectValueQuoted 関数を変更して、チャネルを配列のように処理することができます。これにより、チャネルから JSON 出力へのデータの直接ストリーミングが可能になります。
reflectValueQuoted の配列ケースに対する提案された変更は次のとおりです:
<code class="go">case reflect.Array: e.WriteByte('[') n := v.Len() for i := 0; i < n; i++ { if 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(']')</code>
パッチの利点
このパッチにより、すべてのオブジェクトをメモリにロードせずに大規模なデータ ストリームをエンコードすることがはるかに簡単になります。また、手動で文字列を連結する必要がなくなり、エラーのリスクが軽減され、コードの可読性が向上します。
結論
ただし、提案されたパッチは現在のパッチの一部ではありません。 Encoding/json パッケージは、JSON データのストリーミングをより効率的かつ便利にする潜在的な改善を示しています。
以上がすべてのオブジェクトをメモリにロードせずに、大規模なデータを JSON にストリーミングするにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。