Json からケース クラス (およびその逆) への多くのマッピングを含むストライプ用の API を作成しようとしています。最終的に a になるという問題に遭遇しましたList[JsResult[A]]
(これは、JObject のリストを介してマッピングし、それらに対していくつかの操作を実行して、それらを適切なケース クラスにマップした結果です)。問題のコードは以下です
case class Sources(data: List[PaymentSource],
hasMore: Boolean,
totalCount: Double,
url: String)
implicit val sourcesReader: Reads[Sources] = {
val dataAsList = (__ \ "data").read[List[JsObject]].flatMap{jsObjects =>
val `jsResults` = jsObjects.map{jsObject =>
val `type` = jsObject \ "type"
val paymentSource: JsResult[PaymentSource] = `type` match {
case JsString("card") =>
Json.fromJson[Card](jsObject)
case JsString("bitcoin_receiver") =>
Json.fromJson[BitcoinReceiver](jsObject)
case JsString(s) =>
throw UnknownPaymentSource(s)
case _ =>
throw new IllegalArgumentException("Expected a Json Object")
}
paymentSource
}
jsResults
}
jsResults のタイプは ですがList[JsResult[A]]
、読み取りで適切に構成するには、 aJsResult[A]
または a のいずれかを返す必要がありJsError
ます。
Json.fromJson[Card](jsObject).get
の代わりに実行することもできますがJson.fromJson[Card](jsObject)
、そうすることは、Play Json で累積的なエラー処理を失うことを意味します (エラーをランタイムにプッシュすることも意味します)。