作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 stripe 创建一个 API,其中涉及大量从 Json 到 case 类的映射(反之亦然)。我遇到了一个问题,我最终得到一个 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]]
,但是为了将其与读取正确组合,我们需要返回 JsResult[A]
或一个JsError
。
虽然可以使用 Json.fromJson[Card](jsObject).get
而不是 Json.fromJson[Card](jsObject)
,但这样做意味着我们输了Play Json 中的累积错误处理(这也意味着我们将错误插入运行时)
最佳答案
您可以使用Reads.list()
。
val paymentSourceReader: Reads[PaymentSource] = __.read[JsObject].flatMap { o =>
(__ \ "type").read[String].collect(ValidationError("UnknownPaymentSource")) {
case "card" =>
o.as[Card]
case "bitcoin_receiver" =>
o.as[BitcoinReceiver]
}
}
read[String]
如果没有 type
pproperty,则创建错误。 collect(ValidationError("UnknownPaymentSource")
创建错误,如果输入!(卡|比特币接收器)。 o.as[...]
如果无法转换则抛出异常然后使用“paymentSourceReader”
val dataReader: Reads[List[PaymentSource]] = (__ \ "data").read[List[PaymentSource]](Reads.list(paymentSourceReader))
dataReader
可用于复杂的读取器 Reads[PaymentSource]
以及 Sources
或 json.reads(dataReader)
为 JsResult[List[PaymentSource]]
关于json - 将 List[JsResult[A]] 排序为 JsResult[List[A]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35305248/
我是一名优秀的程序员,十分优秀!