Я использую сборку в классе JSON в Scala 2.8 для анализа кода JSON. Я не хочу использовать тот или иной Liftweb из-за минимизации зависимостей.
То, как я это делаю, кажется слишком важным, есть ли лучший способ сделать это?
import scala.util.parsing.json._
...
val json:Option[Any] = JSON.parseFull(jsonString)
val map:Map[String,Any] = json.get.asInstanceOf[Map[String, Any]]
val languages:List[Any] = map.get("languages").get.asInstanceOf[List[Any]]
languages.foreach( langMap => {
val language:Map[String,Any] = langMap.asInstanceOf[Map[String,Any]]
val name:String = language.get("name").get.asInstanceOf[String]
val isActive:Boolean = language.get("is_active").get.asInstanceOf[Boolean]
val completeness:Double = language.get("completeness").get.asInstanceOf[Double]
}
JSON.parseFull
возвращаетсяOption[Any]
, поэтому он начинается сList(None)
илиList(Some(any))
. ЭтоSome
для сопоставления с образцом наOption
.Вот как я выполняю сопоставление с образцом:
источник
Мне нравится ответ @ huynhjl, он привел меня по правильному пути. Однако он не очень хорошо справляется с ошибками. Если желаемый узел не существует, вы получите исключение приведения. Я немного адаптировал это,
Option
чтобы лучше справиться с этим.Конечно, это не столько обрабатывает ошибки, сколько позволяет избежать их. Это даст пустой список, если какой-либо из узлов json отсутствует. Вы можете использовать a,
match
чтобы проверить наличие узла, прежде чем действовать ...источник
def unapply(a: Option[Any]): Option[T] = a.map(_.asInstanceOf[T])
.MatchError
вместо этого давал (Scala 2.12). Для этого необходимо заключить for в блок try / catch. Есть идеи получше?Я пробовал несколько вещей, отдавая предпочтение сопоставлению с образцом как способу избежать приведения типов, но столкнулся с проблемой стирания типов в типах коллекций.
Основная проблема, по-видимому, заключается в том, что полный тип результата синтаксического анализа отражает структуру данных JSON и является либо громоздким, либо невозможно полностью описать. Я думаю, поэтому Any используется для усечения определений типов. Использование Any приводит к необходимости кастинга.
Я взломал кое-что ниже, что является кратким, но чрезвычайно специфичным для данных JSON, подразумеваемых кодом в вопросе. Что-то более общее было бы более удовлетворительным, но я не уверен, что это было бы очень элегантно.
источник
источник
Вы можете это сделать! Код JSON очень легко разобрать: P
источник
Вот как я делаю библиотеку Scala Parser Combinator:
источник