gpt4 book ai didi

json - Scala Play框架中将json数组转换为模型类的Seq

转载 作者:行者123 更新时间:2023-12-02 09:31:51 28 4
gpt4 key购买 nike

我正在使用 Scala Play 框架和 Instagram API ,我想将 json 数组提取到我的模型类 User:

case class User(val userId: String, val username: String, val profilePhoto: String, val name: String)

API 中的 json 数组示例如下所示:

{
"pagination": {},
"meta": {},
"data": [
{
"username": "carolinabentocb",
"profile_picture": "https://igcdn-photos-f-a.akamaihd.net/hphotos-ak-xfa1/t51.2885-19/s150x150/11429783_1673078532912085_1496721162_a.jpg",
"id": "363753337",
"full_name": "Carolina Bento"
},
{
"username": "pereira3044",
"profile_picture": "https://igcdn-photos-e-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-19/s150x150/11351764_1662987433917180_971708049_a.jpg",
"id": "2141448590",
"full_name": "Alex"
}
]
}

this link它解释了如何将 json 对象映射到模型类,但是如何将 json 数组映射到用户的 Seq/List/Array?

最佳答案

Json 初始代码真的很棒,它是我反序列化 json 的首选方式。您必须修改您的 User 类以适应 instagram 模型 API。或者,您可以创建一个像 InstagramApiUser 这样的案例类或其他东西来进行反序列化,然后如果您认为这更适合您的流程,则将其复制到您自己的类中。这是代码,它可以在 scala repl 中运行。

import play.api.libs.json.{Json, Format}


val js = Json.parse("""{
"pagination": {},
"meta": {},
"data": [
{
"username": "carolinabentocb",
"profile_picture": "https://igcdn-photos-f-a.akamaihd.net/hphotos-ak-xfa1/t51.2885-19/s150x150/11429783_1673078532912085_1496721162_a.jpg",
"id": "363753337",
"full_name": "Carolina Bento"
},
{
"username": "pereira3044",
"profile_picture": "https://igcdn-photos-e-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-19/s150x150/11351764_1662987433917180_971708049_a.jpg",
"id": "2141448590",
"full_name": "Alex"
}
]
}""")

case class User(id: String, username: String, profile_picture: String, full_name: String)
object User {
implicit val jsonFormat: Format[User] = Json.format[User]
}

val result = (js \ "data").as[Seq[User]]

Play Json 库中有三种反序列化 Json 的方法,我认为 as 是最不惯用的一种,因为如果解析失败,它会抛出异常。您可以尝试使用 asOpt[A] 它将生成一个 Option[A] 或更好的 validate[A] 它将生成一个 JsResult[A] 然后您可以记录一个错误,并说明解析 Json 失败的原因。

如果您不喜欢命名案例类成员以匹配 API 名称,您可以手动编写 Reads,如

import play.api.libs.json.{Json, Reads, JsPath}
import play.api.libs.functional.syntax._

case class User(val userId: String, val username: String, val profilePhoto: String, val name: String)
object User {
implicit val jsonReads: Reads[User] = (
(JsPath \ "id").read[String] and
(JsPath \ "username").read[String] and
(JsPath \ "profile_picture").read[String] and
(JsPath \ "full_name").read[String]
)(User.apply _)
}

否则它的工作方式是相同的。

关于json - Scala Play框架中将json数组转换为模型类的Seq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32249332/

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