【问题标题】:How should I handle mapping over a DecodeResult?我应该如何处理对 DecodeResult 的映射?
【发布时间】:2015-10-23 17:55:18
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: scala argonaut


    【解决方案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))
    

    【讨论】:

      猜你喜欢
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多