3 回答

TA貢獻1883條經(jīng)驗 獲得超3個贊
這是一個基于提取器的解決方案,它將進行類轉(zhuǎn)換:
class CC[T] { def unapply(a:Any):Option[T] = Some(a.asInstanceOf[T]) }
object M extends CC[Map[String, Any]]
object L extends CC[List[Any]]
object S extends CC[String]
object D extends CC[Double]
object B extends CC[Boolean]
val jsonString =
"""
{
"languages": [{
"name": "English",
"is_active": true,
"completeness": 2.5
}, {
"name": "Latin",
"is_active": false,
"completeness": 0.9
}]
}
""".stripMargin
val result = for {
Some(M(map)) <- List(JSON.parseFull(jsonString))
L(languages) = map("languages")
M(language) <- languages
S(name) = language("name")
B(active) = language("is_active")
D(completeness) = language("completeness")
} yield {
(name, active, completeness)
}
assert( result == List(("English",true,2.5), ("Latin",false,0.9)))
在for循環(huán)的開始,我人為地將結(jié)果包裝在一個列表中,以便在最后生成一個列表。然后在for循環(huán)的其余部分中,我將使用生成器(使用<-)和值定義(使用=)將利用unapply方法的事實。
(較舊的答案已被刪除-如果您感到好奇,請檢查編輯歷史記錄)

TA貢獻1818條經(jīng)驗 獲得超7個贊
這是我進行模式匹配的方式:
val result = JSON.parseFull(jsonStr)
result match {
// Matches if jsonStr is valid JSON and represents a Map of Strings to Any
case Some(map: Map[String, Any]) => println(map)
case None => println("Parsing failed")
case other => println("Unknown data structure: " + other)
}
添加回答
舉報