Estou usando a compilação na classe JSON no Scala 2.8 para analisar o código JSON. Não quero usar o Liftweb nem um nem outro para minimizar as dependências.
Do jeito que estou fazendo parece muito imperativo, existe uma maneira melhor de fazer isso?
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
retornaOption[Any]
, então começa comList(None)
ouList(Some(any))
. OSome
é para a correspondência de padrões ativadaOption
.É assim que faço a correspondência de padrões:
fonte
Eu gosto da resposta de @huynhjl, ela me levou pelo caminho certo. No entanto, não é excelente para lidar com condições de erro. Se o nó desejado não existir, você obterá uma exceção de elenco. Eu adaptei isso um pouco para fazer uso
Option
para lidar melhor com isso.Claro, isso não trata os erros, mas sim os evita. Isso resultará em uma lista vazia se algum dos nós json estiver faltando. Você pode usar um
match
para verificar a presença de um nó antes de agir ...fonte
def unapply(a: Option[Any]): Option[T] = a.map(_.asInstanceOf[T])
.MatchError
(Scala 2.12). É necessário envolver o for em um bloco try / catch para isso. Alguma ideia melhor?Tentei algumas coisas, favorecendo a correspondência de padrões como uma forma de evitar a projeção, mas tive problemas com o apagamento de tipos nos tipos de coleção.
O principal problema parece ser que o tipo completo do resultado da análise espelha a estrutura dos dados JSON e é complicado ou impossível de definir totalmente. Acho que é por isso que Any é usado para truncar as definições de tipo. O uso de Any leva à necessidade de fundição.
Hackeei algo abaixo que é conciso, mas extremamente específico para os dados JSON implícitos no código em questão. Algo mais geral seria mais satisfatório, mas não tenho certeza se seria muito elegante.
fonte
fonte
Você pode fazer assim! Muito fácil de analisar o código JSON: P
fonte
Esta é a maneira como eu faço a biblioteca combinadora do Scala Parser:
fonte