1

通常,我发现自己使用 JSON,我希望在其中的某个地方用字符串解析,我想以一种非平凡的方式(不仅仅是字符串)进行解析。在这种情况下,我需要为其制作解码器或编解码器,因此我可能会尝试执行以下操作:

CodecJson[URL](_.toString.asJson, h ⇒ 
  h.as[String].flatMap(s ⇒ Try{new URL(s)}.toOption)
)

但这不会编译,因为我不能对选项进行平面映射。

应该如何处理这种(看似常见的)行为?

一种选择是解码为 Option[URL],但如果您只想解码失败,这似乎很糟糕。

是否有一种可接受的方式来处理这些后续的解码操作?

4

1 回答 1

1

要解决平面图问题,您可以从 Try 转换为 DecodeResult。并且以下技术还将字符串推广到 X 编解码器。

def stringToTCodec[T](toString: T => String, fromString: String => T) = CodecJson[T](toString(_).asJson, h ⇒
h.as[String].flatMap(s ⇒ Try(fromString(s)) match {
  case Success(u) => DecodeResult.ok(u)
  case Failure(t) => DecodeResult.fail(s, h.history)
}))

implicit val urlCodec = stringToTCodec[URL](u => u.toString, s => new URL(s))
于 2015-12-18T19:25:13.547 回答