3 回答

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊
這是一個(gè)基于提取器的解決方案,它將進(jìn)行類轉(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)的開(kāi)始,我人為地將結(jié)果包裝在一個(gè)列表中,以便在最后生成一個(gè)列表。然后在for循環(huán)的其余部分中,我將使用生成器(使用<-)和值定義(使用=)將利用unapply方法的事實(shí)。
(較舊的答案已被刪除-如果您感到好奇,請(qǐng)檢查編輯歷史記錄)

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個(gè)贊
這是我進(jìn)行模式匹配的方式:
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)
}
添加回答
舉報(bào)