【问题标题】:How to Encode Map[K,V] using Circe如何使用 Circe 对 Map[K,V] 进行编码
【发布时间】:2021-12-11 14:31:02
【问题描述】:

阅读本文档https://circe.github.io/circe/codecs/custom-codecs.html 我了解您应该使用 Circe KeyEncoder 来定义自定义键类型。

但如果我想在哪里编码Map[K, V],我会感到困惑

case class K(a1: String, a2: String)
case class V(b1: String, b2: String)

【问题讨论】:

  • 嗨马尔塔夫!欢迎:) 你能分享到目前为止你尝试过的任何代码吗?请包括任何(编译)错误消息
  • 您认为 JSON 的外观如何?

标签: scala circe


【解决方案1】:

有类定义;

case class K(a1: String, a2: String)
    
object K {
  import io.circe._
  implicit val encodeK: KeyEncoder[K] = (key: K) => s"${key.a1}-${key.a2}"
    
  implicit val decodeK: KeyDecoder[K] = (s: String) => {
    // Should be careful while parsing a K from String.
    val kParts = s.split("-")
    Some(K(kParts(0), kParts(1)))
  }
}

和

case class V(b1: String, b2: String)

object V {
  import io.circe._
  implicit val encodeV: Encoder[V] = (v: V) => Json.obj(
    ("b1", Json.fromString(v.b1)),
    ("b2", Json.fromString(v.b2))
  )

  implicit val decodeV: Decoder[V] = (c: HCursor) => for {
    b1 <- c.downField("b1").as[String]
    b2 <- c.downField("b2").as[String]
  } yield {
    new V(b1, b2)
  }
}

到/从 JSON 的转换工作如下:


object App {
  import io.circe.syntax._
  def main(args: Array[String]): Unit = {
    val map: Map[K, V] = Map(
      K("a11", "a21") -> V("b11", "b21"),
      K("a12", "a22") -> V("b12", "b22"),
      K("a13", "a23") -> V("b13", "b23")
    )
    
    val json = map.asJson
    println(json)
    println(json.as[Map[K, V]])
  }
}

【讨论】:

    猜你喜欢
    • 2022-11-30
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2019-10-10
    • 2012-08-26
    • 1970-01-01
    相关资源
    最近更新 更多