gpt4 book ai didi

json - 将嵌套对象编码为字符串

转载 作者:行者123 更新时间:2023-12-03 23:33:19 24 4
gpt4 key购买 nike

给定以下案例类:

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)))

我还尝试通过为邮箱编写自定义解码器来解决此问题,但得到了相同的结果。任何有关处理这种情况的正确方法的指导将不胜感激。

完整代码如下:

case class Mailbox(value: String)
object Mailbox {
implicit val encoder: Encoder[Mailbox] = (m: Mailbox) => Json.fromString(m.value)
implicit val decoder: Decoder[Mailbox] = deriveDecoder[Mailbox]
}

case class Group(objectType: String, mailbox: Mailbox)

object Sandbox {
def main(args: Array[String]): Unit = {

val group: Group = Group("Group", Mailbox("mailto:info@example.com"))
val json: String = group.asJson.spaces2
println(json)

parser.decode[Group](json) match {
case Right(group) => println(group)
case Left(err) => println(err)
}
}
}

请注意,这是一个派生示例,仅用于演示我的问题。

最佳答案

作为创建自定义编码器/解码器的替代方法,您还可以使用来自 circe extras 的 deriveUnwrappedEncoder/deriveUnwrappedDecoder

只需在你 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

关于json - 将嵌套对象编码为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66843808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com