2015-04-20 106 views
1

Scala 2.11,具有下面的代碼:在Scala中處理JSON?

import play.api.libs.json._ 
... 
val data = // read json from file        (3) 
val JSON: JsValue = Json.parse(data mkString "\n")   (4) 
val items = JSON \ "items" 
for (i <- 0 until 100) yield items(i) 
  1. 如果我團結的最後兩行for (i <- 0 until 100) yield (JSON \ "items")(i),將術語JSON \ "items"爲每個i或僅計算一次?
  2. 是值得parallelise列表建設這個 for-expression(我不關心哪些項目將 出現在列表中的順序),其中items是JSON對象的數組?
  3. 處理行(3 - 4)中解析JSON並驗證異常的最佳方法是什麼?
+0

1.'JSON \「items」'只是一個檢索元素的dsl構造。它的O(1)可以隨時使用。所有解析和構建AST樹的工作已經在'Json.parse'中完成了。 – ipoteka

+0

準確無誤。(JSON \「items」)(i)'已經夠好了。不幸的是,據我所知,json dsl不支持'JSON \「項目」\\ i'。 – ipoteka

+0

這是一個選擇的問題,我猜。當我從外部解析可能無效的json時,我使用'import scala.util。{Try,Success,Failure}'。但是,當我在我的系統中生成json時,我不會將它們包裝到'Try []'中。不能推薦這些明顯的東西旁邊:( – ipoteka

回答

0
  1. 如果您使用表達式JSON \ "items" 100倍,而不是1,就會有100次工作找到那些節點 - 有沒有majick記憶化或任何類似的事情。你的成本是O(n)相對於你執行它的次數而不是O(1)。但無論如何,對於這個應用程序來說,這種差異是無關緊要的 - 假設沒有外部循環你沒有向我們展示。

  2. 這對於並行化來說太小的bean是有意義的 - 事實上,開銷可能會減慢速度。如果你的真實案例是yield expensiveComputationBasedOn(items(i)),那麼也許。

  3. 對於第3-4行,是的,如果您需要在這裏處理它,請使用Try,否則繼續向上(在調用此方法的方法中)。通常,在最高級別捕獲異常,您仍然可以提供有關日誌消息中出現問題的足夠信息,您可以在其中進行任何故障恢復,以及可以在何處進行調試。這可以節省工作量,並確保您抓住一​​切 - 即使您沒有想到。如果那是你的「主」,那很好。選項不會捕捉異常。警告:如果這是針對一個班級的,則無論您的老師是否在尋找本地錯誤處理,都可以。