【发布时间】:2012-12-31 04:50:47
【问题描述】:
我需要能够处理大型 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 库从那里继续解析:我很好。
我不想做的是在不使用流式传输或使用迭代器的情况下摄取整个文件,因为一次将整个文件保存在内存中会非常昂贵。
【问题讨论】:
-
您会多次提取此文件,还是一次性完成?换句话说,具有预先处理时间但更快地重复查询的解决方案是否有意义?
-
我只需要读一遍,所以回答你的问题:是的。
-
这有点不寻常的数据格式,但我猜这是由于处理方式(map/reduce?) - 更常见的是你会得到一个长序列或项目数组,而不是巨大的 JSON 列表对象属性。这是许多现有解决方案无法按原样工作的主要原因。例如,Jackson 通过
ObjectMapper.reader().readValues(...)支持数据绑定迭代器,其中可以迭代数组(或根级序列)的各个值。
标签: json scala stream iterator jerkson