在Scala中扫描可重新序列化数据的巨大JSON文件
我需要能够处理大型
JSON文件,从可反序列化的子字符串中实例化对象,因为我们正在迭代/流式传输文件.
例如: 假设我只能反序列化为以下实例: case class Data(val a: Int,val b: Int,val c: Int) 和预期的JSON格式是: { "foo": [ {"a": 0,"b": 0,"c": 0 },{"a": 0,"c": 1 } ],"bar": [ {"a": 1,{"a": 1,.... MANY ITEMS ....,"qux": [ {"a": 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库继续从那里解析:我很好. 我不想做的是在没有流式传输或使用迭代器的情况下摄取整个文件,因为一次将整个文件保存在内存中会非常昂贵. 解决方法
我还没有使用JSON(我希望有人会为你提供一个交钥匙解决方案)但是用XML完成它,这是一种处理它的方法.
在流解析器的帮助下,它基本上是一个简单的Map-> Reduce过程. 地图(你的advanceTo) 使用像JSON Simple这样的流解析器(未经测试).在回调时,您匹配“路径”,通过将其写入流(文件支持或内存中,取决于您的数据)收集下面的任何内容.这将是你的例子中的foo数组.如果您的映射器足够复杂,您可能希望在映射步骤中收集多个路径. 减少(你的流[数据]) 由于上面收集的流看起来很小,你可能不需要再次映射/拆分它们,你可以直接在内存中解析它们作为JSON对象/数组并操纵它们(转换,重新组合等等). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |