通常,我发现自己使用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],但如果您只是想解码失败,这似乎是一件糟糕的事。
是否有可接受的处理这些后续解码操作的方法?
答案 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))