次のJsonを解析してScalaオブジェクトにしようとしています:
{
"oneOf": [
{ "$ref": "..." },
{ "$ref": "..." },
{ "$ref": "..." }
}
フィールド「oneOf」は、「anyOf」または「allOf」の場合もあります。これらの値の 1 つだけになります。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) などをチェックして、利用可能な結果を得ることができますが、正しい構文を取得する方法がわかりません。
このケース クラスを構築するよりエレガントな方法はありますか?
ありがとう、
マイク