Ich verwende die Build-in-JSON-Klasse in Scala 2.8, um JSON-Code zu analysieren. Ich möchte das eine oder andere Liftweb nicht verwenden, da die Abhängigkeiten minimiert werden.
Die Art und Weise, wie ich es mache, scheint zu zwingend. Gibt es einen besseren Weg, es zu tun?
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
kehrt zurückOption[Any]
, also beginnt es mitList(None)
oderList(Some(any))
. DasSome
ist für die Musterübereinstimmung aufOption
.So mache ich den Pattern Match:
quelle
Ich mag die Antwort von @ huynhjl, sie hat mich auf den richtigen Weg geführt. Es ist jedoch nicht besonders gut im Umgang mit Fehlerbedingungen. Wenn der gewünschte Knoten nicht vorhanden ist, erhalten Sie eine Cast-Ausnahme. Ich habe dies leicht angepasst, um
Option
es besser nutzen zu können.Dies behandelt natürlich Fehler nicht so sehr, als dass sie vermieden werden. Dies ergibt eine leere Liste, wenn einer der JSON-Knoten fehlt. Sie können a verwenden
match
, um das Vorhandensein eines Knotens zu überprüfen, bevor Sie handeln ...quelle
def unapply(a: Option[Any]): Option[T] = a.map(_.asInstanceOf[T])
.MatchError
(Scala 2.12). Musste das für in einen Try / Catch-Block dafür einwickeln. Irgendwelche schöneren Ideen?Ich habe ein paar Dinge ausprobiert und den Mustervergleich bevorzugt, um das Casting zu vermeiden, aber ich hatte Probleme mit der Typlöschung der Sammlungstypen.
Das Hauptproblem scheint zu sein, dass der vollständige Typ des Analyseergebnisses die Struktur der JSON-Daten widerspiegelt und entweder umständlich oder nicht vollständig anzugeben ist. Ich denke, deshalb wird Any verwendet, um die Typdefinitionen abzuschneiden. Die Verwendung von Any führt zur Notwendigkeit des Castings.
Ich habe etwas gehackt, das kurz ist, aber äußerst spezifisch für die JSON-Daten ist, die durch den Code in der Frage impliziert werden. Etwas allgemeineres wäre zufriedenstellender, aber ich bin mir nicht sicher, ob es sehr elegant wäre.
quelle
quelle
Das kannst du so machen! Sehr einfach zu analysierender JSON-Code: P.
quelle
So mache ich die Scala Parser Combinator Library:
quelle