使用Scala和JSON4S解析大型JSON文件

时间:2016-03-01 02:15:23

标签: json scala parsing intellij-idea json4s

我在IntelliJ IDEA 15中使用Scala并尝试解析大型Twitter记录json文件并计算主题标签的总数。我是Scala的新手和函数式编程的想法。 json文件中的每一行都是一个json对象(代表一条推文)。文件中的每一行都是这样开始的:

{"in_reply_to_status_id":null,"text":"To my followers sorry..
{"in_reply_to_status_id":null,"text":"#victory","in_reply_to_screen_name"..
{"in_reply_to_status_id":null,"text":"I'm so full I can't move"..

我最感兴趣的是一个名为" entity"其中包含一个名为" hastags"带有一个主题标签列表。这是一个例子:

"entities":{"hashtags":[{"text":"thewayiseeit","indices":[0,13]}],"user_mentions":[],"urls":[]},

我浏览了各种用于解析json的scala框架,并决定使用json4s。我的Scala脚本中有以下代码。

    import org.json4s.native.JsonMethods._

    var json: String = ""
    for (line <- io.Source.fromFile("twitter38.json").getLines) json += line
    val data = parse(json)

我的逻辑是,我试图将twitter38.json中的每一行读入一个字符串,然后使用parse()解析整个字符串。解析函数抛出错误声明:

  

&#34;类型不匹配,预期:无,找到:字符串。&#34;

我见过在包含json对象的字符串上使用parse()的例子,例如

val jsontest =
"""{
    |"name" : "bob",
    |"age" : "50",
    |"gender" : "male"
    |}
""".stripMargin
val data = parse(jsontest)

但我收到了同样的错误。我来自面向对象的编程背景,我接近这个问题的方式是否存在根本性的错误?

1 个答案:

答案 0 :(得分:0)

您很可能错误地将Intellij项目或模块的依赖项导入到您的文件中。确保已导入以下行:

import org.json4s.native.JsonMethods._

即使您正确导入此模块,parse(String: json)也不适合您,因为您错误地形成了json。你的json String看起来像这样:

"""{"in_reply_...":"someValue1"}{"in_reply_...":"someValues2"}"""

但应该看起来像是一个可以解析的有效json:

"""{{"in_reply_...":"someValue1"},{"in_reply_...":"someValues2"}}"""

即。你需要json的起始和结束括号,以及每行推文之间的逗号。有关更多信息,请阅读json4s文档。