ホームページ >バックエンド開発 >Golang >オブジェクト全体をメモリにロードせずに JSON ストリームをマーシャリングする方法

オブジェクト全体をメモリにロードせずに JSON ストリームをマーシャリングする方法

Barbara Streisand
Barbara Streisandオリジナル
2024-10-28 19:16:29440ブラウズ

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

オブジェクト全体を読み込まずに 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。