Scala Circe Decode Тип карты [String, String] - PullRequest
0 голосов
/ 10 октября 2018

У меня есть 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 голосов
/ 12 ноября 2018

Нечто подобное должно работать, но, как сказал выше Энди, в этом случае вы сможете использовать автоматическое или полуавтоматическое деривация.

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]
          )
        })
      })
    )
  }
}
...