Estoy usando la clase build in JSON en Scala 2.8 para analizar el código JSON. No quiero usar Liftweb ni ningún otro debido a la minimización de dependencias.
La forma en que lo estoy haciendo parece demasiado imperativa, ¿hay una mejor manera de hacerlo?
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
regresaOption[Any]
, entonces comienza conList(None)
oList(Some(any))
. ElSome
es para hacer coincidir patronesOption
.Esta es la forma en que hago la coincidencia de patrones:
fuente
Me gusta la respuesta de @huynhjl, me llevó por el camino correcto. Sin embargo, no es bueno para manejar condiciones de error. Si el nodo deseado no existe, obtiene una excepción de transmisión. He adaptado esto un poco para utilizarlo
Option
y manejarlo mejor.Por supuesto, esto no maneja los errores tanto como los evita. Esto producirá una lista vacía si falta alguno de los nodos json. Puede utilizar a
match
para comprobar la presencia de un nodo antes de actuar ...fuente
def unapply(a: Option[Any]): Option[T] = a.map(_.asInstanceOf[T])
.MatchError
(Scala 2.12). Necesitaba envolver el for en un bloque try / catch para eso. ¿Alguna idea mejor?Probé algunas cosas, favoreciendo la coincidencia de patrones como una forma de evitar la conversión, pero tuve problemas con el borrado de tipos en los tipos de colección.
El principal problema parece ser que el tipo completo del resultado del análisis refleja la estructura de los datos JSON y es engorroso o imposible de establecer por completo. Supongo que es por eso que se usa Any para truncar las definiciones de tipo. El uso de Any conduce a la necesidad de un casting.
He pirateado algo a continuación que es conciso pero es extremadamente específico para los datos JSON implícitos en el código de la pregunta. Algo más general sería más satisfactorio pero no estoy seguro de si sería muy elegante.
fuente
fuente
¡Puedes hacerlo así! Muy fácil de analizar el código JSON: P
fuente
Esta es la forma en que hago la biblioteca Scala Parser Combinator:
fuente