J'utilise la construction dans la classe JSON dans Scala 2.8 pour analyser le code JSON. Je ne veux pas utiliser l'un ou l'autre Liftweb en raison de la minimisation des dépendances.
La façon dont je le fais me semble trop impérative, y a-t-il une meilleure façon de le faire?
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
retourneOption[Any]
, donc ça commence parList(None)
ouList(Some(any))
. LeSome
est pour la correspondance de motifs activéeOption
.Voici comment je fais la correspondance de motif:
la source
J'aime la réponse de @ huynhjl, cela m'a conduit sur la bonne voie. Cependant, il n'est pas excellent pour gérer les conditions d'erreur. Si le nœud souhaité n'existe pas, vous obtenez une exception de conversion. J'ai légèrement adapté cela pour l'utiliser
Option
pour mieux gérer cela.Bien sûr, cela ne gère pas les erreurs mais les évite. Cela donnera une liste vide si l'un des nœuds json est manquant. Vous pouvez utiliser a
match
pour vérifier la présence d'un nœud avant d'agir ...la source
def unapply(a: Option[Any]): Option[T] = a.map(_.asInstanceOf[T])
.MatchError
place (Scala 2.12). Nécessaire pour envelopper le for dans un bloc try / catch pour cela. Des idées plus sympas?J'ai essayé plusieurs choses, en privilégiant la correspondance de motifs pour éviter la diffusion, mais j'ai rencontré des problèmes d'effacement de type sur les types de collection.
Le principal problème semble être que le type complet du résultat d'analyse reflète la structure des données JSON et est soit encombrant, soit impossible à énoncer complètement. Je suppose que c'est pourquoi Any est utilisé pour tronquer les définitions de type. L'utilisation de Any entraîne le besoin de lancer.
J'ai piraté quelque chose ci-dessous qui est concis mais extrêmement spécifique aux données JSON impliquées par le code de la question. Quelque chose de plus général serait plus satisfaisant mais je ne suis pas sûr que ce soit très élégant.
la source
la source
Vous pouvez faire comme ça! Code JSON très facile à analyser: P
la source
C'est ainsi que je fais la bibliothèque du combinateur Scala Parser:
la source