我定义了一个具有“视频”信息的用户:
case class User(name:String, video: Option[Video])
case class Video(title:String, url:String)
我们有这样一个json:
{
"name": "somename",
"video": {
"title": "my-video",
"url": "https://youtube.com/watch?v=123123"
}
}
我可以使用这样的代码来解析它:
implicit def DecodeUser: DecodeJson[User] = for {
name <- as[String]("name")
video <- as[Option[Video]]("video")
} yield User(name, video)
implicit def DecodeVideo: DecodeJson[Option[Video]] = for {
titleOpt <- as[Option[String]]("title")
urlOpt <- as[Option[String]]("url")
} yield (titleOpt, urlOpt) match {
case (Some(title), Some(url)) => Video(title, url)
case _ => None
}
从 中DecodeVideo
,您可以看到我只想在同时提供“标题”和“url”的情况下提供视频。
如果 json 包含“视频”部分,它运行良好。但如果没有,argonaut 将报告未提供“视频”部分。
如何使“视频”可选?