メモリにロードせずに JSON で大規模なデータ ストリームをマーシャリングする
大規模なデータ ストリームを JSON にエンコードする必要がよくありますが、全体をロードする必要があります。一度にメモリにストリームすることは現実的ではない可能性があります。この記事では、組み込みの json.Marshaler インターフェイスを使用せずにこの課題を克服する方法を検討します。
json.Encoder によるエンコード: 制限事項
大規模なストリームのエンコードを試みるjson.Encoder を使用したデータの実行は、メモリ内のチャネル (chan 文字列) を処理できないため失敗します。
カスタム JSON エンコーディング
適切なビルドが存在しない場合-ソリューションでは、カスタム JSON エンコーディングが必要になります。これには、以下のスニペットに示すように、JSON 文字列を手動で構築することが含まれます。
w := os.Stdout w.WriteString(`{ "Foo": "` + t.Foo + `", "Bar": [`) for x := range t.Bar { _ = json.NewEncoder(w).Encode(x) w.WriteString(`,`) } w.WriteString(`]}`)
チャネル サポートのエンコーディング/json の拡張
エンコーディング/json パッケージを拡張するにはチャネルのサポートを使用すると、encoding/json/encode.go のreflectValueQuoted 関数を変更できます。具体的には、次のようなチャネルのケースを追加します。
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 で効率的にマーシャリングするための代替アプローチ。カスタム エンコーディングを使用すると、データを JSON 出力に直接ストリーミングできますが、エンコーディング/json を拡張すると、より堅牢なソリューションが提供されます。
以上がメモリにロードせずに大規模なデータ ストリームを JSON で効率的にマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。