大規模な JSON 配列のストリーミング デコード
Unmarshal を使用すると、ファイル全体をロードするため、大規模な JSON 配列をファイルから取得するとメモリを大量に消費する可能性があります。データを一度にメモリに取り込みます。これに対処するには、ストリーミング技術を利用して配列を要素ごとに処理できます。
ストリーム デコーダーを使用した例
エンコーディング/json パッケージは、JSON をストリーミングするためのソリューションを提供します。処理。パッケージのドキュメントの拡張例を次に示します。
package main import ( "encoding/json" "fmt" "log" "strings" ) func main() { const jsonStream = ` [ {"Name": "Ed", "Text": "Knock knock."}, {"Name": "Sam", "Text": "Who's there?"}, {"Name": "Ed", "Text": "Go fmt."}, {"Name": "Sam", "Text": "Go fmt who?"}, {"Name": "Ed", "Text": "Go fmt yourself!"} ] ` type Message struct { Name, Text string } dec := json.NewDecoder(strings.NewReader(jsonStream)) // read open bracket t, err := dec.Token() if err != nil { log.Fatal(err) } fmt.Printf("%T: %v\n", t, t) // while the array contains values for dec.More() { var m Message // decode an array value (Message) err := dec.Decode(&m) if err != nil { log.Fatal(err) } fmt.Printf("%v: %v\n", m.Name, m.Text) } // read closing bracket t, err = dec.Token() if err != nil { log.Fatal(err) } fmt.Printf("%T: %v\n", t, t) }
この例では、ストリーム デコーダー (dec) を作成し、ループ内で dec.More() を使用して配列要素を反復処理します。各メッセージはデコードされ、配列全体をメモリにロードせずにその内容が出力されます。
以上がメモリの問題を回避するために大規模な JSON 配列をストリーム デコードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。