- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图将“5m”或“5s”或“5ms”形式的字符串解码为 FiniteDuration 类型的对象,分别为 5.minutes、5.seconds、5.milliseconds。
我正在尝试为涉及 FiniteDuration 类的项目创建自定义解码器和编码器。编码器没有问题,因为它只是读取 FiniteDuration 类的字段并生成字符串。但是,我在编写解码器时遇到了困难,我想知道我在做什么是可能的。
FiniteDuration 是一个具有如下构造函数的类:FiniteDuration(length: Long, unit: TimeUnit)。 Scala 附带了一些方便的语法糖,以便可以使用符号 5.minutes、5.seconds 或 5.milliseconds 来调用该类。在这种情况下,Scala 会为您创建 FiniteDuration 类。
这个想法是将这个 FiniteDuration 类转换为像“5m”或“5s”或“5ms”这样的字符串,这对眼睛来说更容易。
implicit val d2json: Encoder[FiniteDuration] = new Encoder[FiniteDuration] {
override def apply(a: FiniteDuration): Json = ???
}
implicit val json2d: Decoder[FiniteDuration] = new Decoder[FiniteDuration] {
override def apply(c: HCursor): Decoder.Result[FiniteDuration] = ???
}
最佳答案
这是一个有效的基本实现(可能需要根据您对 FiniteDuration 的编码方式进行调整。
基本上,您需要做的是获取光标的值 String
, 将该字符串拆分为持续时间和句点,并尝试将这两个部分都转换为 Long
和 TimeUnit
分别(因为 FiniteDuration
构造函数接受它们作为参数)。
请注意,这些转换必须返回 Either[DecodingFailure, _]
与 cursor.as[_]
的返回类型一致所以你可以在for-comprehension中使用它们。
我对这些转换使用了隐式扩展方法,因为我发现它们很方便,但您可以编写基本函数。
implicit class StringExtended(str: String) {
def toLongE: Either[DecodingFailure, Long] = {
Try(str.toLong).toOption match {
case Some(value) => Right(value)
case None => Left(DecodingFailure("Couldn't convert String to Long", List.empty))
}
}
def toTimeUnitE: Either[DecodingFailure, TimeUnit] = str match {
case "ms" => Right(TimeUnit.MILLISECONDS)
case "m" => Right(TimeUnit.MINUTES)
// add other cases in the same manner
case _ => Left(DecodingFailure("Couldn't decode time unit", List.empty))
}
}
implicit val decoder: Decoder[FiniteDuration] = (c: HCursor) =>
for {
durationString <- c.as[String]
duration <- durationString.takeWhile(_.isDigit).toLongE
period = durationString.dropWhile(_.isDigit)
timeUnit <- period.toTimeUnitE
} yield {
FiniteDuration(duration, timeUnit)
}
println(decode[FiniteDuration]("5ms".asJson.toString))
// Right(5 milliseconds)
关于json - 如何在 Circe 中创建一个自定义解码器来解析时间值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55859780/
我是一名优秀的程序员,十分优秀!