gpt4 book ai didi

json - 如何在 Circe 中创建一个自定义解码器来解析时间值

转载 作者:行者123 更新时间:2023-12-04 18:33:53 41 4
gpt4 key购买 nike

我试图将“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] = ???
}

编码器我写应该没问题。解码器更棘手。我不确定该怎么做,因为 apply 方法需要 HCursor 类型的输入。

最佳答案

这是一个有效的基本实现(可能需要根据您对 FiniteDuration 的编码方式进行调整。

基本上,您需要做的是获取光标的值 String , 将该字符串拆分为持续时间和句点,并尝试将这两个部分都转换为 LongTimeUnit分别(因为 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/

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