将嵌套对象编码为字符串

给定以下案例类:

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


以上是将嵌套对象编码为字符串的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>