Я попробовал несколько вещей, предпочитая сопоставление с образцом как способ избежать приведения, но столкнулся с проблемой стирания типов на типах коллекций.
Основная проблема, как представляется, заключается в том, что полный тип результата анализа отражает структуру данных JSON и является либо громоздким, либо его невозможно полностью описать.Я думаю, именно поэтому Любой используется для усечения определений типов.Использование Any приводит к необходимости приведения.
Я взломал что-то ниже, что является кратким, но чрезвычайно специфичным для данных JSON, подразумеваемых кодом в вопросе.Что-то более общее было бы более удовлетворительным, но я не уверен, будет ли оно очень элегантным.
implicit def any2string(a: Any) = a.toString
implicit def any2boolean(a: Any) = a.asInstanceOf[Boolean]
implicit def any2double(a: Any) = a.asInstanceOf[Double]
case class Language(name: String, isActive: Boolean, completeness: Double)
val languages = JSON.parseFull(jstr) match {
case Some(x) => {
val m = x.asInstanceOf[Map[String, List[Map[String, Any]]]]
m("languages") map {l => Language(l("name"), l("isActive"), l("completeness"))}
}
case None => Nil
}
languages foreach {println}