首页 > 解决方案 > 如何为 Map[String, Any] 编写自定义 circe 编解码器

问题描述

是否可以使用 circe 为 Map[String, Any] 编写自定义解码器?我找到了这个,但它只是转换为 Json:

def mapToJson(map: Map[String, Any]): Json =
    map.mapValues(anyToJson).asJson

  def anyToJson(any: Any): Json = any match {
    case n: Int => n.asJson
    case n: Long => n.asJson
    case n: Double => n.asJson
    case s: String => s.asJson
    case true => true.asJson
    case false => false.asJson
    case null | None => None.asJson
    case list: List[_] => list.map(anyToJson).asJson
    case list: Vector[_] => list.map(anyToJson).asJson
    case Some(any) => anyToJson(any)
    case map: Map[String, Any] => mapToJson(map)
  }

标签: scalacirce

解决方案


import io.circe.syntax.EncoderOps
import io.circe.{Encoder, Json}

case class Person(name: String, age: Int)
object Person {
  implicit val decoder: io.circe.Decoder[Person] = io.circe.generic.semiauto.deriveDecoder
  implicit val encoder: io.circe.Encoder[Person] = io.circe.generic.semiauto.deriveEncoder
}

case class Home(area: Int)
object Home {
  implicit val decoder: io.circe.Decoder[Home] = io.circe.generic.semiauto.deriveDecoder
  implicit val encoder: io.circe.Encoder[Home] = io.circe.generic.semiauto.deriveEncoder
}

def jsonPrinter[A](obj: A)(implicit encoder: Encoder[A]): Json =
    obj.asJson

jsonPrinter(Person("Eminem", 30))
jsonPrinter(Home(300))

这是用泛型完成的,我希望它有帮助


推荐阅读