我有一个 Map [String,String] 对象,我想用作json。我已经为此类型编写了一个编码器:
implicit val encodeMap: Encoder[Map[String, String]] = new Encoder[Map[String, String]] {
override def apply(values: Map[String, String]): Json = {
values.toList
.map(pair => Json.obj(
(pair._1, pair._2.asJson)
)).asJson
}
}
除了编码器外,我还需要一个解码器,但是我不知道如何编写它。到目前为止,我最好的尝试:
implicit val decodeMap: Decoder[Map[String, String]] = new Decoder[Map[String, String]] {
final def apply(c: HCurser): Decoder.Result[Map[String, String]] = ???
}
很基本,但是我真的不知道如何解决这个问题。
谢谢!
答案 0 :(得分:1)
类似的事情应该起作用,但是正如安迪上文所述,在这种情况下,您应该能够使用自动或半自动推导。
import cats.syntax.either._
implicit val decodeMap: Decoder[Map[String, String]] = new Decoder[Map[String, String]] {
override def apply(c: HCursor): Decoder.Result[Map[String, String]] = {
c.keys.fold[Decoder.Result[Map[String, String]]](Right(Map.empty))(
_.foldLeft(Map[String, String]().asRight[DecodingFailure])((res, k) => {
res.flatMap((m: Map[String, String]) => {
c.downField(k).as[String].fold(
_.asLeft[Map[String, String]],
v => (m + (k -> v)).asRight[DecodingFailure]
)
})
})
)
}
}