【发布时间】:2014-10-22 08:03:54
【问题描述】:
我定义了一个拥有“视频”信息的用户:
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,您可以看到我只想提供视频,前提是同时提供“标题”和“网址”。
如果 json 包含“视频”部分,则效果很好。但如果没有,argonaut 会报告未提供“视频”部分。
如何使“视频”成为可选?
【问题讨论】:
-
您使用的是什么版本的 argonaut?我在他们的网站上找不到您正在使用的
as[T]方法或任何关于这种反序列化方法的文档。