2015-04-20 45 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,否则继续向上(在调用此方法的方法中)。通常,在最高级别捕获异常,您仍然可以提供有关日志消息中出现问题的足够信息,您可以在其中进行任何故障恢复,以及可以在何处进行调试。这可以节省工作量,并确保您抓住一​​切 - 即使您没有想到。如果那是你的“主”,那很好。选项不会捕捉异常。警告:如果这是针对一个班级的,则无论您的老师是否在寻找本地错误处理,都可以。