Scala circe解码Map [String,String]类型

时间:2018-10-10 19:02:32

标签: scala circe

我有一个 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]] = ???

}

很基本,但是我真的不知道如何解决这个问题。
谢谢!

1 个答案:

答案 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]
          )
        })
      })
    )
  }
}