您也可以结合内部的多个读/验证步骤的理解。以下是两个函数,一个返回Option[_]
,另一个返回Boolean
。第一个允许使用数据,而后者只能进行验证。
import org.json4s.jackson.JsonMethods._
val text =
"""
|{
| "foo": "bar",
| "baz": "fnord",
| "qux": true
|}
""".stripMargin
val json = parse(text)
def readFoo(x: JValue): Option[(String, String, Boolean)] = for {
JObject(_) <- x.toOption
JString(foo) <- (x \ "foo").toOption
JString(baz) <- (x \ "baz").toOption
JBool(qux) <- (x \ "qux").toOption
if (qux == true)
} yield (foo, baz, qux)
def validateOnly(x: JValue): Boolean = (for {
JObject(_) <- x.toOption
JString(foo) <- (x \ "foo").toOption
JString(baz) <- (x \ "baz").toOption
JBool(qux) <- (x \ "qux").toOption
if (qux == true)
} yield true) getOrElse false
println(readFoo(json)) // Some((bar,fnord,true))
println(readFoo(json).isDefined) // true
println(validateOnly(json)) // true
这是接近我在找什么。 – douglaz
喜欢它。让我补充一点简洁:隐式类JValueExtended(value:JValue)def has(childString:String):Boolean =(value \ childString)!= JNothing } –