gpt4 book ai didi

json - 在 Scala 中扫描一个巨大的 JSON 文件以获取可反序列化的数据

转载 作者:行者123 更新时间:2023-12-04 12:41:53 24 4
gpt4 key购买 nike

我需要能够处理大型 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 库从那里继续解析:我很好。

我不想做的是在不流式传输或使用迭代器的情况下摄取整个文件,因为一次将整个文件保存在内存中会非常昂贵。

最佳答案

我没有用 JSON 完成它(我希望有人会为你想出一个交 key 解决方案)但用 XML 完成它,这里是一种处理它的方法。

在流解析器的帮助下,它基本上是一个简单的 Map->Reduce 过程。

map (您的 advanceTo)

使用像 JSON Simple 这样的流解析器(未测试)。当您在回调中匹配您的“路径”时,通过将其写入流(文件支持或内存中,取决于您的数据)来收集下面的任何内容。那将是您的 foo你的例子中的数组。如果您的映射器足够复杂,您可能希望在映射步骤期间收集多个路径。

减少 (您的 stream[Data])

由于您上面收集的流看起来很小,您可能不需要再次映射/拆分它们,您可以直接在内存中将它们解析为 JSON 对象/数组并对其进行操作(转换、重组等...)。

关于json - 在 Scala 中扫描一个巨大的 JSON 文件以获取可反序列化的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14365694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com