我有一个看起来像这样的 JSON:
{
"data": [
{
"id": "1",
"email": "hello@world.com",
"name": "Mr foo",
"roles": [
"Chief Bar Officer"
],
"avatar_url": null,
"phone_number": null
},
{
"id": "2",
"email": "bye@world.com",
"name": "Mr baz",
"roles": [
"Chief Baz Officer"
],
"avatar_url": null,
"phone_number": null
}
]
}
我主要对解析/反序列化数据列表感兴趣,我想手动进行(出于某种神秘原因,我更喜欢手动方式)。
如果这是相关的,我正在使用 sttp 的 circe 库sttp.client.circe._
,目的是将来自 get 请求的传入数据直接解析为使用asJson
.
获取 sttp 请求类似于:
val r1 = basicRequest
.get(uri"https://woooo.woo.wo/v1/users")
.header("accept", "application/json")
.header("Authorization", "topsecret"
.response(asJson[SomeClass])
这是我到目前为止所尝试的:
// Define the case class
case class User(
id: String,
email: String,
name: String,
roles: List[String],
avatar_url: Option[String],
phone_number: Option[String]
)
// Define the manual deserializer
case object User {
implicit val userDecoder: Decoder[User] = (hCursor: HCursor) => {
val data = hCursor.downField("data").downArray
for {
id <- data.get[String]("id")
email <- data.get[String]("email")
name <- data.get[String]("name")
roles <- data.get[List[String]]("roles")
avatarUrl <- data.get[Option[String]]("avatarUrl")
phoneNumber <- data.get[Option[String]]("phoneNumber")
} yield User(id, email, name, roles, avatarUrl, phoneNumber)
}
}
我的方法的问题(我认为)是.downArray
让我只序列化用户数组中的第一个用户。
我的目标是能够拥有一些用户序列(List[User]
可能是这样),但目前我最终只反序列化数组中的一个用户。
值得一提的是,“data”数组,并不包含固定数量的用户,每次api调用都会产生不同数量的用户。