理解のために複数の読み取り/検証ステップを組み合わせることもできます。以下に 2 つの関数を示します。1 つは an を返し、Option[_]
もう 1 つは a を返します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