我有代码片段
cursor.downField("params").downField("playlist").downField("items").as[List[Clip]]
Run Code Online (Sandbox Code Playgroud)
Clip是一个简单的字符串和数字类.传入的Json应该包含一个json对象"播放列表",其中包含一个"项目"数组,其中每个项目都是一个剪辑.所以json看起来应该是这样的
{
"playlist": {
"name": "Sample Playlist",
"items": [
{
"clipId":"xyz",
"name":"abc"
},
{
"clipId":"pqr",
"name":"def"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
使用上面的代码片段,我收到编译错误:
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]]
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?如何使用circe为简单项目的列表/数组设置解码?
Tra*_*own 10
为了完整起见,您可以创建一个自定义解码器,在其处理中包含导航,而不是导航到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")
)
Run Code Online (Sandbox Code Playgroud)
如果你有这个:
val json = """{ "params": {
"playlist": {
"name": "Sample Playlist",
"items": [
{
"clipId":"xyz",
"name":"abc"
},
{
"clipId":"pqr",
"name":"def"
}
]
}
}}"""
Run Code Online (Sandbox Code Playgroud)
您可以像这样使用解码器:
scala> io.circe.parser.decode(json)(decodeClipsParam)
res3: Either[io.circe.Error,List[Clip]] = Right(List(Clip(xyz,abc), Clip(pqr,def)))
Run Code Online (Sandbox Code Playgroud)
我可能更进一步使用自定义案例类:
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")
)
}
Run Code Online (Sandbox Code Playgroud)
现在你可以这样写:
scala> io.circe.parser.decode[PlaylistParam](json).foreach(println)
PlaylistParam(Sample Playlist,List(Clip(xyz,abc), Clip(pqr,def)))
Run Code Online (Sandbox Code Playgroud)
但是,如何分割导航和解码主要是为了品味.
| 归档时间: |
|
| 查看次数: |
8626 次 |
| 最近记录: |