如何使用Circe创建选项类型的自定义编码?

博士

可能会有一个看起来像这样的类:

case class Amount(value: Int)
case class Data(insurance: Option[Amount], itemPrice: Amount)

如果insurance = None应该获得默认值waived: true

例如:

Data(Some(123),100).asJson

// output
{
  "insurance": {
    "value": 123
  },
  "price": 100
}

And when no Insurance is opted for:

Data(None,100).asJson

// output
{
  "insurance": {
    "waived: true
  },
  "price": 100
}

如何实现这种细粒度的控制?我尝试了各种招数用forProduct2mapJsonObject,但无法得到它的行为的权利:

implicit val testEncoder = deriveEncoder[Option[Amount]].mapJsonObject(j => {

    val x = j("Some") match {
      case Some(s) => // need to convert to [amount -> "value"]
      case None => JsonObject.apply(("waived",Json.fromBoolean(true)))
    }

    x
  })

这很容易让我waived:true胜任,但不知道如何处理Some(s)此案。

安德烈·帕特西夫(Andrey Patseev)

如果具有{"waived": true}预期的行为(Option[Amount]如果为None),那么如果您编写用于以下目的的自定义编码器,则可以依靠半自动派生的编码器Option[Amount]

这是一个例子

import io.circe.{Encoder, Json}
import io.circe.syntax._
import io.circe.generic.semiauto._

case class Amount(value: Int)
case class Data(insurance: Option[Amount], itemPrice: Amount)

object Amount {
  implicit val encoder: Encoder[Amount] = deriveEncoder
}

object Data {
  implicit val encoderOptionalAmount: Encoder[Option[Amount]] = (optA: Option[Amount]) =>
      optA match {
        case Some(amount) => amount.asJson
        case None => Json.obj("waived" -> true.asJson)
      }

  implicit val encoder: Encoder[Data] = deriveEncoder[Data]
}

println(Data(insurance = None, itemPrice = Amount(10)).asJson)

/*
{
  "insurance" : {
    "waived" : true
  },
  "itemPrice" : {
    "value" : 10
  }
}
*/

工作原理:deriveEncoder[Data]将为itemPrice(类型Amount)和保险类型调用隐式编码器Option[Amount]

默认编码器Option[T]仅会跳过该值,None但是由于我们为Option[T]最近的作用域(数据对象伴随)定义了另一个隐式编码器,因此它不会在全局范围内寻找隐式编码器,从而为您提供所需的确切信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python如何使用自定义编码实现排序?

如何在Spark 2.X数据集中创建自定义编码器?

自定义编码Python

WordPress和自定义编码

Alamofire 3自定义编码到Alamofire 4自定义编码

在 python 3.6 中处理自定义编码时遇到类型错误

如何在SonarQube 5.1.1中定义自定义编码规则?

使用logback使用自定义编码器限制消息大小

使用Angular 2 Router的URL的自定义编码(使用+号代替空格)

嵌套结构的自定义编码

django JsonResponse 忽略的自定义编码器

在mysql中排序自定义编码的数据

使用NSData自定义编码,初始化但崩溃

WCF自定义编码器-在运行时分配消息内容类型

如何将自定义编码文件转换为UTF-8(使用Java或使用专用工具)

如何从 Swift 中的自定义编码/解码 json 中删除数据模型 nil 字段

使用自定义编码器实例化kafka生产者时,无法实例化

如何使用 ACF 为自定义帖子类型创建自定义端点?

如何创建自定义属性类型

python3自定义编码mik-bulgarian

WCF。在自定义编码器中绑定请求和响应

如何从相同的自定义编码二进制文件中定义二进制(1和0)序列以构成汇编语言?

如何使用自定义类型malloc()?

如何在Circe中创建自定义解码器以解析时间值

如何使用与帖子类型名称不同的存档段创建自定义帖子类型

如何创建自定义SeekBar首选项?

可编码的自定义枚举类型

如何使用android.support.v7.preference库创建自定义首选项?

如何使用选项运行在 composer.json 中创建的自定义命令?