【问题标题】:Is it possible to use Scala's parser combinator to parse a JSON text file line by line?是否可以使用 Scala 的解析器组合器逐行解析 JSON 文本文件?
【发布时间】:2018-10-08 19:19:56
【问题描述】:

是否可以使用 Scala 的解析器组合器逐行解析 JSON 文本文件?

我是 Scala 新手。在阅读《Scala 编程》这本书时,我对 Scala 的解析器组合器很感兴趣 并打算写一个简单的JSON解析器作为练习。

我打算从文本文件中读取并解析文件内容。通过一点研究,我意识到阅读 不建议将文件的所有内容放入内存(例如Source.fromFile("1.json").getLines.mkString),然后将该内容提供给方法parseAll

所以我的问题是:是否可以逐行读取文本文件,然后以基于行的方式进行解析?

我在网上搜索了但没有找到任何线索。

感谢任何提示。谢谢!

【问题讨论】:

  • 不要假设 JSON 数据包含换行符。可能都在一行上。

标签: scala text-parsing parser-combinators


【解决方案1】:

你可以这样做:

Source.fromFile("1.json").getLines.forEach

您返回的迭代器是BufferedLineIterator,这意味着默认情况下它不会将所有行读入内存。 当您调用 mkString 时,您要求迭代器读取所有行并从中创建一个字符串。

您应该记住的唯一一件事是您需要为多行的 JSON 对象做好准备。

{"id": 1, "name": "Joe"}

{
   "id": 1,
   "name": "Joe"
}

应该产生相同的对象,但逐行阅读示例 2 有点棘手

【讨论】:

  • 感谢您的回答。 Scala 的解析器组合器的parse 方法读取一个字符串并进行解析。我的问题是 fromFile("1.json").getLines 给了我一个迭代器,我只能向方法解析提供一行,这意味着 parse 方法一次只能处理一行。有什么方法可以进行“减少/折叠”样式解析?
  • 假设您只支持我回答中的第一个示例:lines.foldLeft(List[JSONObject]()){case (l: List[JSONObject], s) => l ++ List(parse(s))}
猜你喜欢
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 2020-01-17
相关资源
最近更新 更多