我应该如何处理DecodeResult上的映射?

时间:2015-10-23 17:55:18

标签: scala argonaut

通常,我发现自己使用JSON,我希望用内部的字符串解析,我想以非平凡的方式解析(而不仅仅是字符串)。在这种情况下,我需要为它做一个解码器或编解码器,所以我可能会尝试做类似以下的事情:

map<string, map<string, double>> grid;

for (??? product = ???; product ???; ++product)
{
    productTotal = 0;
    for (??? person = ???; person ???; ++person)
    {
        productTotal += grid[person->first][product->first];
    }
    productFunction(product->first, productTotal);
}

但这不会编译,因为我无法在一个Option上进行flatMap。

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

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

是否有可接受的处理这些后续解码操作的方法?

1 个答案:

答案 0 :(得分:1)

要解决flatmap问题,您可以从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))