将嵌套对象编码为字符串
给定以下案例类:
case class Mailbox(value: String)
case class Group(objectType: String, mailbox: Mailbox)
我试图找到一种编码 Group 对象的方法,如下所示,其中mailbox编码为字符串值,而不是对象:
{
"objectType" : "Group",
"mailbox" : "mailto:info@example.com"
}
通过自动推导,编码/解码都成功了,但我最终得到了如下预期的结果:
{
"objectType" : "Group",
"mailbox" : {
"value" : "mailto:info@example.com"
}
}
我可以通过添加如下所示的自定义编码器来实现我想要的结果:
object Mailbox {
implicit val encoder: Encoder[Mailbox] = (m: Mailbox) => Json.fromString(m.value)
implicit val decoder: Decoder[Mailbox] = deriveDecoder[Mailbox]
}
但是,解码失败并显示以下内容:
DecodingFailure(Attempt to decode value on failed cursor, List(DownField(value), DownField(mailbox)))
DecodingFailure(Attempt to decode value on failed cursor, List(DownField(value), DownField(mailbox)))
我试图通过为邮箱编写自定义解码器来解决这个问题,但得到了相同的结果。任何有关处理这种情况的正确方法的指导将不胜感激。
这是完整的代码:
请注意,这是一个派生示例,仅用于演示我的问题。
回答
作为创建自定义编码器/解码器的替代方法,您还可以使用deriveUnwrappedEncoder/deriveUnwrappedDecoderfrom circe extras。
只需在您中添加以下导入buid.sbt:
libraryDependencies += "io.circe" %% "circe-generic-extras" % "xxx"
然后你将能够做到:
import io.circe.generic.extras.semiauto._
implicit val encoder: Encoder[Mailbox] = deriveUnwrappedEncoder
implicit val decoder: Decoder[Mailbox] = deriveUnwrappedDecoder