我正在尝试为条带创建一个 API,其中涉及从 Json 到案例类的大量映射(反之亦然)。我遇到了一个问题,我最终得到了一个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 中的累积错误处理(这也意味着我们将错误推送到运行时)