为了为Map[String, Any]编写自定义circe编解码器,我们可以按照以下步骤进行操作:
import io.circe._
import io.circe.parser._
import io.circe.syntax._
case class MyClass(data: Map[String, Any])
Json
和JsonObject
来处理Map[String, Any]的编解码。implicit val myClassEncoder: Encoder[MyClass] = new Encoder[MyClass] {
final def apply(a: MyClass): Json = {
val jsonMap = a.data.foldLeft(JsonObject.empty) { case (acc, (k, v)) =>
acc.add(k, Json.fromValues(List(v.asJson)))
}
Json.fromJsonObject(jsonMap)
}
}
implicit val myClassDecoder: Decoder[MyClass] = new Decoder[MyClass] {
final def apply(c: HCursor): Decoder.Result[MyClass] = {
val map = c.value.asObject
.flatMap(_.toMap.mapValues(_.as[List[Any]].getOrElse(List())))
map match {
case Some(m) => Right(MyClass(m))
case None => Left(DecodingFailure("Failed to decode MyClass", c.history))
}
}
}
val myMap: Map[String, Any] = Map("key1" -> "value1", "key2" -> 123, "key3" -> true)
val myClassInstance = MyClass(myMap)
val jsonStr = myClassInstance.asJson.toString
println(jsonStr) // 输出: {"data":{"key1":"value1","key2":123,"key3":true}}
val jsonString = """{"data":{"key1":"value1","key2":123,"key3":true}}"""
val decoded = decode[MyClass](jsonString)
decoded match {
case Left(error) => println("解码失败: " + error)
case Right(obj) => println("解码成功: " + obj.data)
}
这样,我们就成功地为Map[String, Any]编写了自定义的circe编解码器。这个编解码器可以将Map[String, Any]转换为JSON字符串,以及将JSON字符串解码为Map[String, Any]。请注意,这里的示例代码仅供参考,并可能需要根据实际需求进行修改。
领取专属 10元无门槛券
手把手带您无忧上云