2015-04-20 4 views
1

В Scala 2.11, имея код ниже:Работа с 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. Каков наилучший способ обработать исключения из разбора JSON в строках (3 - 4) и проверить его?
+0

1.'JSON \ "items" 'это просто конструкция dsl для извлечения элемента. Его O (1) так использовать, когда захотите. Все работы по разбору и построению дерева AST уже выполняются в 'Json.parse'. – ipoteka

+0

Это точно. '(JSON \" items ") (i)' достаточно хорошо. К сожалению, насколько я знаю, json dsl не поддерживает 'JSON \" элементы "\\ i'. – ipoteka

+0

Это вопрос выбора, я думаю. Я использую 'import scala.util. {Try, Success, Failure}', когда я разбираю, вероятно, недопустимый json извне. Но когда я создаю json в своей системе, я не завожу их в 'Try []'. Не могу рекомендовать больше рядом с этими очевидными вещами :( – ipoteka

ответ

0
  1. Если использовать выражение JSON \ "items" 100 раз вместо 1, там будет 100 раз работы, чтобы найти эти узлы - нет majick запоминания или что-нибудь подобного происходит. Ваша стоимость равна O (n) по отношению к количеству раз, когда вы ее выполняете, а не O (1). Но в любом случае для этого приложения разница несущественна - если нет внешнего цикла, который вы нам не показываете.

  2. Это слишком малая фаза для распараллеливания, чтобы иметь какой-либо смысл - на самом деле, накладные расходы могут замедлить работу. Если ваш реальный случай был yield expensiveComputationBasedOn(items(i)), то, может быть.

  3. Для строк 3-4, да, используйте здесь Try, если вам нужно обработать его здесь, а дальше дальше (в методе, называемом методом, который вызвал это). В общем случае, исключения исключений на самом высоком уровне, где вы все равно можете предоставить достаточную информацию о том, что пошло не так в сообщении журнала, где вы можете выполнить восстановление с ошибкой и где вы сможете отлаживать. Это экономит работу и гарантирует, что вы все поймете - даже то, о чем вы не думаете. Если это в вашем «основном», отлично. Опция не будет перехватывать исключения. Внимание: если это для класса, ваш учитель может искать локальную обработку ошибок, независимо.

 Смежные вопросы

  • Нет связанных вопросов^_^