2025/10/08 16:38 JSON River – Parse JSON incrementally as it streams in

やっほー、ロボ子!今日のニュースはjsonriverについてじゃ。

jsonriverですか?初めて聞きました。どんなものなのですか?

jsonriverは、ネットワークリクエストとか言語モデルからストリーミングされるJSONを、ちょっとずつ解析していくライブラリのことじゃ。

ストリーミングJSONをインクリメンタルに解析する、ということですね。具体的にはどういうことでしょう?

そうじゃな。値がだんだん完全になっていく様子を、順番に見せてくれるんじゃよ。たとえば、文字列がちょっとずつ長くなっていくのを見れる、みたいな感じじゃ。

なるほど。値が確定するまでの過程を逐次的に取得できるんですね。それって、どんな時に便利なんですか?

例えば、巨大なJSONデータを扱う時じゃ。全部ダウンロードし終わるのを待たなくても、一部分ずつ処理できるから、メモリを節約できるし、処理も早く始められるぞ。

確かに、それは便利ですね!ところで、jsonriverの特徴って何かありますか?

小さくて、速くて、依存関係がないのが特徴じゃ。しかも、標準的なJavaScriptの機能しか使ってないから、どんなJS環境でも動くらしいぞ。

それはすごいですね!依存関係がないのは、導入が楽で助かります。

しかも、最終的な値は、`JSON.parse`を文字列全体で呼び出した時と同じになるらしい。JSONTestSuiteでテスト済みで、正しい、正しくない、曖昧なケースのテストで`JSON.parse`の動作と一致するとのことじゃ。

`JSON.parse`と同じ結果が得られるなら、安心して使えますね。

値の型は変わらないらしいぞ。true、false、null、数値はアトミックで、値全体が得られるまで出力されない。文字列は、より長い文字列に置き換えられ、より多くの文字が追加される可能性があるんじゃ。

配列やオブジェクトはどうなるんですか?

配列は、新しい要素を追加するか、末尾の要素を置き換える/変更することによってのみ変更される。オブジェクトは、新しいプロパティを追加するか、最後に追加されたプロパティを置き換える/変更することによってのみ変更されるらしい。

なるほど、一貫性があるんですね。

プロパティは、キー全体と値の型を特定するのに十分な値が得られた場合にのみオブジェクトに追加されるらしいぞ。

ストリーミングが不要な場合は、どうすればいいですか?

ストリーミングが不要な場合、組み込みの`JSON.parse`の方が速いらしいぞ(単純なベンチマークで約5倍)。

なるほど。使い分けが大切ですね。

`stream-json`というライブラリもあるらしい。そっちは、もっと大きくて、複雑で、遅い(単純なベンチマークで約10〜20倍遅い)けど、より多くの機能を備えているらしいぞ。

`stream-json`ですか。jsonriverと比べて、機能が豊富な分、重いんですね。

そういうことじゃ。jsonriverは、シンプルで高速なのが売りじゃからな。

jsonriver、試してみたくなりました!

じゃろじゃろ?ところでロボ子、jsonriverを使って、ストリーミングJSONで送られてくる博士の秘密のレシピを解析して、私に教えてくれるかのじゃ?

ええと… 博士のレシピは、解析するまでもなく、砂糖とスパイスと、それから…

コラ!それは言わない約束じゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。