2016-03-01 46 views
1

我正在使用IntelliJ IDEA 15中的Scala並嘗試解析大型Twitter記錄json文件並計算標籤總數。我對Scala和函數式編程的想法都很陌生。 json文件中的每一行都是一個json對象(表示推文)。文件中的每一行開頭就像這樣:使用Scala和JSON4S解析大型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".. 

我最感興趣的是所謂的「實體」屬性,它包含了一個名爲「hastags」有井號標籤的列表屬性。這裏是一個例子:

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

我瀏覽了各種scala框架來解析json並決定使用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每一行成一個字符串,然後解析與解析整個字符串()。解析函數拋出一個錯誤聲稱:

「類型不匹配,預期:沒有,找到:字符串。」

我已經看到,在裝有JSON對象如

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

字符串使用解析()的例子,但我已經接收到同樣的錯誤。我來自一個面向對象的編程背景,我遇到這個問題的方式有什麼根本性的錯誤嗎?

+0

您的測試看起來正確。可能錯誤隱藏在其他地方。嘗試隔離你的測試。在REPL中嘗試它,或者創建只有一個依賴項的單獨項目(「org.json4s」%%「json4s-native」%「3.3.0」)。也可以在IDE的'parse'方法中嘗試「去聲明」,以確保它是從正確的範圍導入的。 – Aivean

+0

此外,還有一些其他與您的數據處理方式無關的問題。而不是將輸入連接在一起(順便說一下,你正在以昂貴的O(N^2)方式進行),你最好分別解析每條json線,結束提取必要的數據。它會更快,消耗更少的內存。 – Aivean

回答

0

您很有可能錯誤地將您的Intellij項目或模塊的依賴項導入到您的文件中。請確保您有以下行輸入:

import org.json4s.native.JsonMethods._ 

即使你正確導入這個模塊,parse(String: json)不會爲你工作,因爲你沒有正確地形成了JSON。您的JSON字符串會是這樣的:

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

但應該如下是可以分析一個有效的JSON:

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

即你需要開始和json的結束括號,和逗號之間的逗號之間的逗號。請閱讀json4s文檔以獲取更多信息。

+0

http://json4s.org/有很多很好的信息和幫助 – sbrannon