ホームページ >バックエンド開発 >C++ >Json.NET はどのようにして JSON デシリアライゼーションをストリーミングして大きなファイルを効率的に処理できるのでしょうか?

Json.NET はどのようにして JSON デシリアライゼーションをストリーミングして大きなファイルを効率的に処理できるのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-19 01:51:09744ブラウズ

How Can Json.NET Stream JSON Deserialization to Process Large Files Efficiently?

大きな 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 サイトの他の関連記事を参照してください。

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