gpt4 book ai didi

json - 将 List[JsResult[A]] 排序为 JsResult[List[A]]

转载 作者:行者123 更新时间:2023-12-02 04:13:17 27 4
gpt4 key购买 nike

我正在尝试为 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]
}
}
  1. read[String] 如果没有 type pproperty,则创建错误。
  2. collect(ValidationError("UnknownPaymentSource") 创建错误,如果输入!(卡|比特币接收器)。
  3. o.as[...] 如果无法转换则抛出异常

然后使用“paymentSourceReader”

val dataReader: Reads[List[PaymentSource]] = (__ \ "data").read[List[PaymentSource]](Reads.list(paymentSourceReader))

dataReader 可用于复杂的读取器 Reads[PaymentSource] 以及 Sourcesjson.reads(dataReader)JsResult[List[PaymentSource]]

关于json - 将 List[JsResult[A]] 排序为 JsResult[List[A]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35305248/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com