オブジェクト全体を読み込まずに JSON ストリームをマーシャリングする
目標は、ストリーム全体をメモリに保持せずに大規模なデータ ストリームをエンコードすることです。 JSON は一般的なデータ形式ですが、標準ライブラリの json.Marshaler インターフェイスでは、これを実現する簡単な方法が提供されていません。
カスタム文字列の構築
現在、 WriteString を使用して JSON 文字列を手動で構築しています。これは、組み込み機能がないことを考慮すると合理的なアプローチです。この方法を使用すると、一度に小さなデータ チャンクのみを処理できるようになります。
エンコーディング/json の変更
エンコーディング/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 中国語 Web サイトの他の関連記事を参照してください。