我需要能够处理大型 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 库从那里继续解析的干净方法:我很好。
我不想做的是在没有流式传输或使用迭代器的情况下摄取整个文件,因为一次将整个文件保存在内存中会非常昂贵。