- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 Circe 解码以下 ADT:
sealed trait PaymentType
object PaymentType extends EnumEncoder[PaymentType] {
case object DebitCard extends PaymentType
case object Check extends PaymentType
case object Cash extends PaymentType
case object Mobile extends PaymentType
}
sealed trait CreditCard extends PaymentType
object CreditCard extends EnumEncoder[CreditCard] {
case object UNKNOWN_CREDIT_CARD extends CreditCard
case object NOT_ACCEPTED extends CreditCard
case object VISA extends CreditCard
case object MASTER_CARD extends CreditCard
case object DINERS_CLUB extends CreditCard
case object AMERICAN_EXPRESS extends CreditCard
case object DISCOVER_CARD extends CreditCard
}
PaymentType
,其中有一些直接继承人和另一个密封性状家族
CreditCard
.现在解码是这样完成的:
object CreditCard {
implicit val decoder: Decoder[CreditCard] = Decoder.instance[CreditCard] {
_.as[String].map {
case "NOT_ACCEPTED" => NOT_ACCEPTED
case "VISA" => VISA
case "MASTER_CARD" => MASTER_CARD
case "DINERS_CLUB" => DINERS_CLUB
case "AMERICAN_EXPRESS" => AMERICAN_EXPRESS
case "DISCOVER_CARD" => DISCOVER_CARD
case _ => UNKNOWN_CREDIT_CARD
}
}
object PaymentType {
implicit val decoder: Decoder[PaymentType] = Decoder.instance[PaymentType] {
_.as[String].flatMap {
case "DebitCard" => Right(DebitCard)
case "Check" => Right(Check)
case "Cash" => Right(Cash)
case "Mobile" => Right(Mobile)
case _ => Left(DecodingFailure("", List()))
}
}.or(CreditCard.decoder.widen)
}
PaymentType
解码器,特别是我需要创建一个额外的和不必要的实例
DecodingFailure
在完全正常的情况下,当遇到基于信用卡的支付类型时。我们已经将 99.9% 的 CPU 花在了 JSON 处理上,只是看起来不太对劲。要么是糟糕的 ADT 设计,要么 Circe 应该有办法更好地处理这个问题。有任何想法吗?
最佳答案
您可以将回退移至 CreditCard
解码器进入PaymentType
解码器案例,可让您避免失败:
implicit val decoder: Decoder[PaymentType] = Decoder.instance[PaymentType] { c =>
c.as[String].flatMap {
case "DebitCard" => Right(DebitCard)
case "Check" => Right(Check)
case "Cash" => Right(Cash)
case "Mobile" => Right(Mobile)
case _ => CreditCard.decoder(c)
}
}
sealed trait PaymentType
object PaymentType extends EnumEncoder[PaymentType] {
case object DebitCard extends PaymentType
case object Check extends PaymentType
case object Cash extends PaymentType
case object Mobile extends PaymentType
private val nameMapping = List(DebitCard, Check, Cash, Mobile).map(pt =>
pt.productPrefix -> pt
).toMap
def fromString(input: String): Option[PaymentType] = nameMapping.get(input)
}
sealed trait CreditCard extends PaymentType
object CreditCard extends EnumEncoder[CreditCard] {
case object UNKNOWN_CREDIT_CARD extends CreditCard
case object NOT_ACCEPTED extends CreditCard
case object VISA extends CreditCard
case object MASTER_CARD extends CreditCard
case object DINERS_CLUB extends CreditCard
case object AMERICAN_EXPRESS extends CreditCard
case object DISCOVER_CARD extends CreditCard
private val nameMapping = List(
NOT_ACCEPTED,
VISA,
MASTER_CARD,
DINERS_CLUB,
AMERICAN_EXPRESS,
DISCOVER_CARD
).map(pt => pt.productPrefix -> pt).toMap
def fromString(input: String): CreditCard =
nameMapping.getOrElse(input, UNKNOWN_CREDIT_CARD)
}
fromString
编写解码器方法,这对我来说就像是解决问题的更好方法(在我的脑海中,我不确定哪种方法会涉及更少的分配)。不过,这可能主要是品味问题。
关于json - Circe:高效解码多级ADT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42300772/
我正在尝试为菊石 REPL 创建一个 predef.sc 文件。这是我写的 val fs2Version = "2.2.2" val circeVersion = "0.13.0" // fs2 in
我正在尝试为两个案例类生成编码器和解码器: object EventBusCases { case class ValuationRequest(function: RequestValue =
我已经为 JSON 表示定义了几个 case 类,但我不确定我是否做得正确,因为有很多嵌套的 case 类。 spec、meta 等实体属于 JSONObject 类型以及自定义对象本身。 这是我定义
为什么我得到错误 could not find Lazy implicit value of type io.circe.generic.decoding.DerivedDecoder[A$A6.th
我正在尝试将一些类编码为 json 字符串,但是无论我尝试什么,我的类似乎都无法为我正在使用的案例类找到隐式编码器。 这是我能够精简到的最小示例。 import io.circe._ import i
我以前见过类似的问题,但没有一个有效。我认为他们会问一些不同的问题,所以我在这里问。 我在一个文件中有这样的东西: sealed trait Thing case class SomeThing()
我的目标是将 JSON 转换为以下模型: case class Container(typeId: Int, timestamp: Long, content: Content) sealed tra
我想用 Circe 解码以下 ADT: sealed trait PaymentType object PaymentType extends EnumEncoder[PaymentType] {
我想将案例类的 Array[Byte] 字段编码为 Base64 字符串。出于某种原因,Circe 没有使用默认编解码器选择我的编解码器,而是将字节数组转换为 json 整数数组。 我应该怎么做才能修
我正在尝试使用 scala json 库 Circe,将它包装在一个简单的 trait 中以提供与 json 的转换,我有以下内容: import io.circe.generic.auto._ im
我试图将“5m”或“5s”或“5ms”形式的字符串解码为 FiniteDuration 类型的对象,分别为 5.minutes、5.seconds、5.milliseconds。 我正在尝试为涉及 F
当字段可以具有不同的原始值类型时,我在解析 json 时遇到问题。例如,我可以得到 json: { "name" : "john", "age" : 31 } 或者它可以是这种形式: {
我有一些 json,其中包含一些字段,这些字段被压缩为 bson-ish 格式,如 {"foo.bar" : "bash"} .我想将其转换为以下表示 {"foo" : { "bar" : "bash
我正在尝试实现类似的东西 object Claims { import shapeless._ import shapeless.labelled.FieldType import io.
我正在尝试使用 Circe 对对象列表进行编码,看起来类似于: val test = Seq(MyObject("hello", None, 1, 2, None) 我正在尝试使用 Circe 解析它
我的问题有点棘手。我有一个看起来像这样的案例类 case class Foo( id: String, name: String, field1: Boolean, f
我有以下案例类: final case class Camel(firstName: String, lastName: String, waterPerDay: Int) 和circe配置: obj
有没有办法将单个 None 字段序列化为“null”? 例如: // When None, I'd like to serialize only f2 to `null` case class Exa
我是 Scala 新手,正在使用 circe 来建模和序列化一些 API 响应。我发现自己使用以下样板 sealed trait SomeTrait object SomeTrait { im
可以有一个如下所示的类: case class Amount(value: Int) case class Data(insurance: Option[Amount], itemPrice: Amo
我是一名优秀的程序员,十分优秀!