大きな JSON ファイルの効率的な処理: Json.NET ストリーミング逆シリアル化
メモリに完全にロードできない大規模な JSON データ セットを扱う場合、効率的な解析が重要です。 Json.NET は、JsonReader
を通じて強力なストリーミング JSON データ処理ソリューションを提供します。
問題の概要
JSON ファイルには一連の同一オブジェクトが含まれています。目的は、ファイル全体をメモリにロードせずに、一度に 1 つのオブジェクトを読み取ることです。
失敗しました
最初にファイルを逆シリアル化しようとすると、オブジェクトではなく JSON 配列が予期されていたため、例外が発生しました。配列をリストに逆シリアル化するとエラーは解決されましたが、メモリの消費量が多くなりました。
ストリーミング ソリューション
これらの制限を回避するために、提案されたソリューションでは JSON ファイルを 1 文字ずつ読み取り、リーダーがオブジェクトの開始を示す「{」文字に遭遇した場合にのみオブジェクトを逆シリアル化します。
コード例
JsonReader
を使用して JSON ファイルをストリーミングするために最適化されたコードは次のとおりです:
<code class="language-csharp">JsonSerializer serializer = new JsonSerializer(); MyObject o; using (FileStream s = File.Open("bigfile.json", FileMode.Open)) using (StreamReader sr = new StreamReader(s)) using (JsonReader reader = new JsonTextReader(sr)) { while (reader.Read()) { // 仅当流中存在 "{" 字符时才反序列化 if (reader.TokenType == JsonToken.StartObject) { o = serializer.Deserialize<MyObject>(reader); // 对 o 对象进行处理 } } }</code>
このコードは、RAM をあまり消費せずに、ストリーム内でオブジェクトが検出されるたびにオブジェクトを逆シリアル化して、ファイルを効率的に読み取ります。 myobject
は実際のオブジェクト タイプ MyObject
に置き換える必要があることに注意してください。 o
オブジェクトの処理がコードに追加され、逆シリアル化後に各オブジェクトを操作できるようになりました。
以上がJson.NET はどのようにして JSON デシリアライゼーションをストリーミングして大きなファイルを効率的に処理できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。