gpt4 book ai didi

json - 如何在scala中使用Circe解码JSON列表/数组

转载 作者:行者123 更新时间:2023-12-04 16:42:31 25 4
gpt4 key购买 nike

我有代码片段

cursor.downField("params").downField("playlist").downField("items").as[List[Clip]]

其中Clip是字符串和数字的简单案例类。传入的Json应该包含一个带有“项目”数组的json对象“播放列表”,其中每个项目都是一个剪辑。所以json应该看起来像
{
"playlist": {
"name": "Sample Playlist",
"items": [
{
"clipId":"xyz",
"name":"abc"
},
{
"clipId":"pqr",
"name":"def"
}
]
}
}

上面的代码段中,出现编译错误:
 Error:(147, 81) could not find implicit value for parameter d:     
io.circe.Decoder[List[com.packagename.model.Clip]]
cursor.downField("params").downField("playlist").downField("items").as[List[Clip]]

我究竟做错了什么?如何使用circe为简单项目的列表/数组设置解码?

最佳答案

为了完整起见,您可以创建自定义解码器,而不是导航到JSON值然后对剪辑进行解码,而是将自定义解码器包括在其处理过程中:

import io.circe.Decoder, io.circe.generic.auto._

case class Clip(clipId: String, name: String)

val decodeClipsParam = Decoder[List[Clip]].prepare(
_.downField("params").downField("playlist").downField("items")
)

然后,如果您有以下内容:
val json = """{ "params": {
"playlist": {
"name": "Sample Playlist",
"items": [
{
"clipId":"xyz",
"name":"abc"
},
{
"clipId":"pqr",
"name":"def"
}
]
}
}}"""

您可以像这样使用解码器:
scala> io.circe.parser.decode(json)(decodeClipsParam)
res3: Either[io.circe.Error,List[Clip]] = Right(List(Clip(xyz,abc), Clip(pqr,def)))

我可能会更进一步,并使用自定义案例类:
import io.circe.generic.auto._
import io.circe.generic.semiauto.deriveDecoder

case class Clip(clipId: String, name: String)
case class PlaylistParam(name: String, items: List[Clip])

object PlaylistParam {
implicit val decodePlaylistParam: Decoder[PlaylistParam] =
deriveDecoder[PlaylistParam].prepare(
_.downField("params").downField("playlist")
)
}

现在,您可以编写以下代码:
scala> io.circe.parser.decode[PlaylistParam](json).foreach(println)
PlaylistParam(Sample Playlist,List(Clip(xyz,abc), Clip(pqr,def)))

但是,如何拆分导航和解码主要取决于您的口味。

关于json - 如何在scala中使用Circe解码JSON列表/数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42288948/

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