大きな JSON ファイルを処理し、ファイルを反復処理/ストリーミングする際に、デシリアライズ可能な部分文字列からオブジェクトをインスタンス化できる必要があります。
例えば:
次のインスタンスにのみ逆シリアル化できるとしましょう。
case class Data(val a: Int, val b: Int, val c: Int)
予想される JSON 形式は次のとおりです。
{ "foo": [ {"a": 0, "b": 0, "c": 0 }, {"a": 0, "b": 0, "c": 1 } ],
"bar": [ {"a": 1, "b": 0, "c": 0 }, {"a": 1, "b": 0, "c": 1 } ],
.... MANY ITEMS .... ,
"qux": [ {"a": 0, "b": 0, "c": 0 } }
私がやりたいことは次のとおりです。
import com.codahale.jerkson.Json
val dataSeq : Seq[Data] = Json.advanceToValue("foo").stream[Data](fileStream)
// NOTE: this will not compile since I pulled the "advanceToValue" out of thin air.
最後に、Jerkson または Play フレームワークに付属するその他のライブラリを使用するソリューションを見つけたいと思いますが、別の Scala ライブラリがこのシナリオをより簡単に適切なパフォーマンスで処理できる場合: 私は別のライブラリを試すことに反対しません。 . ファイルを手動でシークし、Json ライブラリを使用してそこから解析を続行するクリーンな方法があれば、それで問題ありません。
私がやりたくないのは、一度にファイル全体をメモリに保持すると法外なコストがかかるため、ストリーミングやイテレータを使用せずにファイル全体を取り込むことです。