メモリにロードせずに大規模なデータ ストリームを 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 パッケージを拡張するには、reflectValueQuoted を変更できます。関数はencoding/json/encode.goにあります。具体的には、
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 を拡張すると、より堅牢なソリューションが提供されます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3