У меня 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._
с намерением анализировать входящие данные из запросов на получение непосредственно в Json, используя 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
заставляет меня сериализовать только первого пользователя в массиве Users.
Моя цель - иметь возможность иметь некоторую последовательность пользователей (что-то вроде List[User]
возможно), но на данный момент я завершаю десериализацию только одного user в массиве.
Стоит отметить, что массив «data» не содержит фиксированного числа пользователей, и каждый вызов API может привести к другому количеству пользователей.