gpt4 book ai didi

json - 如何使用 argonaut 解析可选的自定义字段?

转载 作者:行者123 更新时间:2023-12-05 08:10:05 25 4
gpt4 key购买 nike

我定义了一个有“视频”信息的用户:

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中,你可以看到我只想在同时提供“title”和“url”的情况下提供视频。

如果 json 包含“视频”部分,则效果很好。但如果没有,argonaut 将报告未提供“视频”部分。

如何使“视频”成为可选的?

最佳答案

我似乎无法弄清楚您的代码如何与 argonaut 集成。 as[T] 方法的所有实例似乎都不匹配您使用的签名。无论如何,这是一个类似的问题和解决方案:

object Test {

case class Video(title: String, url: String)

def test(titleOptIn: List[Option[String]], urlOptIn: List[Option[String]]): List[Option[Video]] = {
for {
titleOpt <- titleOptIn
urlOpt <- urlOptIn
} yield (titleOpt, urlOpt) match {
case (Some(title), Some(url)) => Some(Video(title, url))
case _ => None.asInstanceOf[Option[Video]]
}
}

def main(args: Array[String]): Unit = {
test(List(Some("t")), List(Some("u"), None)).foreach(println)
}
}

// Has Output:
// Some(Video(t,u))
// None

特别注意,yield comprehension 应该返回一个 Option[String],因为您的 yield 很可能将结果包装在 DecodeJson 中,就像我的示例将它包装在一个列表。请注意,asInstanceOf on None 是可选的;如果它不存在,IntelliJ 会提示,但它实际上编译得很好。

我认为您缺少的具体内容是将 Video 包装在 Some 中。

关于json - 如何使用 argonaut 解析可选的自定义字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26502800/

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