我正在尝试将以下 Json 解析为 Scala 对象:
{
"oneOf": [
{ "$ref": "..." },
{ "$ref": "..." },
{ "$ref": "..." }
}
字段“oneOf”也可以是“anyOf”或“allOf”;它只是这些值之一。我正在使用 Play 的 JSON 库构建一个案例类 ComplexType。逻辑很简单;它查找给定字段并在存在时读取它,否则检查不同的字段。
(json \ "allOf") match {
case a:JsArray => ComplexType("object", "allOf", a.as[Seq[JsObject]].flatMap(_.values.map(_.as[String])))
case _ =>
(json \ "anyOf") match {
case a:JsArray => ComplexType("object", "anyOf", a.as[Seq[JsObject]].flatMap(_.values.map(_.as[String])))
case _ =>
(json \ "oneOf") match {
case a:JsArray => ComplexType("object", "oneOf", a.as[Seq[JsObject]].flatMap(_.values.map(_.as[String])))
case _ => ComplexType("object", "oneOf", "Unspecified" :: Nil)
}
}
}
我对这种语法不满意;即使它有效,我也不明白为什么如果找不到匹配项,我需要嵌套匹配语句。我相信 for-comprehension 会很好地工作:我可以在保护子句中检查 (json \"allOf")、(json \"oneOf) 等并产生可用的结果,但不确定如何使语法正确。
有没有更优雅的方式来构建这个案例类?
谢谢,
麦克风