gpt4 book ai didi

json - 将多个 json 对象转换为 scala 对象

转载 作者:行者123 更新时间:2023-12-02 21:52:38 25 4
gpt4 key购买 nike

如何从请求中读取多个 json 对象并将它们转换为我自己的自定义对象。例如,假设我们正在使用以下 json 检索用户列表:

{
"users":[
{
"name": "Bob",
"age": 31.0,
"email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c2a0ada082a5afa3abaeeca1adaf" rel="noreferrer noopener nofollow">[email protected]</a>"
},
{
"name": "Kiki",
"age": 25.0,
"email": null
}
]
}

我的案例类如下所示

case class User(firstName: String, age: Double, email: String)

在这种情况下,firstName 值与“name”json 值不同。如何从给定的 json 文件中获取具有不同名称的 Seq[User]。我找不到任何有人从包含多个对象的 json 文件中读取内容的示例。

提前致谢。

最佳答案

Play 的type class-based JSON 库为具有适当实例的任何 A 提供 Seq[A] 的读取器和写入器实例,因此您所要做的就是为您的用户类型提供一个读取器实例,并您可以免费获得一个针对一组用户的阅读器。

我们可以从以下案例类开始(请注意,我已经使用 Option 明确表明电子邮件地址是可选的):

case class User(firstName: String, age: Double, email: Option[String])

接下来我们定义我们的阅读器。我正在使用2.1's combinators ,但还有其他(更详细)选项。

import play.api.libs.json._
import play.api.libs.functional.syntax._

implicit val userReads = (
(__ \ 'name).read[String] and
(__ \ 'age).read[Double] and
(__ \ 'email).read[Option[String]]
)(User.apply _)

我们可以测试一下:

val userJson = """{
"users": [
{ "name": "Bob", "age": 31.0, "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="82e0ede0c2e5efe3ebeeace1edef" rel="noreferrer noopener nofollow">[email protected]</a>" },
{ "name": "Kiki", "age": 25.0, "email": null }
]
}"""

val users = (Json.parse(userJson) \ "users").as[Seq[User]]

然后:

scala> users foreach println
User(Bob,31.0,Some(<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="89ebe6ebc9eee4e8e0e5a7eae6e4" rel="noreferrer noopener nofollow">[email protected]</a>))
User(Kiki,25.0,None)

正如预期的那样。

关于json - 将多个 json 对象转换为 scala 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18301747/

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