Как декодировать Json с корневым массивом? - PullRequest
0 голосов
/ 13 июня 2018

У меня возникли проблемы с выяснением того, как декодировать json с корневым массивом в класс case с использованием библиотеки json4s-jackson.

Цель извлечения непосредственно в класс case, а не в Seq[Username], состоит в проверке существования единственного значения на стадии decode -> construction, а не в более позднее время.

Когда корнем является , а не массив , все отлично работает :

Рабочий пример:

{
    "users": [{"name": "someName1"}]
}

case class Username(name: String)
case class UsersInfo(users: Seq[Username])

implicit private def reader: Reader[UsersInfo] = (value: JValue) => value.extract[UsersInfo]

def decode: EntityDecoder[IO, UsersInfo] = jsonOf[IO, UsersInfo]

Но , когда у json есть корневой массив, он начинает плохо пахнуть:

[
  {
    "name": "someFancyName"
  }
]

case class UsersInfo extends Seq[Username] // Smelly & does not compile

Есть ли "правильный" способ декодирования корневых массивов ?Есть ли какой-нибудь элегантный способ сделать это?

1 Ответ

0 голосов
/ 13 июня 2018

Одним из возможных решений может быть проверка результата декодирования в функции декодера.


замените это:

implicit private def reader: Reader[UsersInfo] = (value: JValue) => value.extract[UsersInfo]

на что-то вроде:

implicit private def reader: Reader[Username] = (value: JValue) => {
  val extracted = value.extract[Seq[UsersInfo]]

  require(extracted.size == 1, s"UserInfo Json must contain a single username value, but it contains [ ${extracted.size} ] values")

  Username(extracted.head.name)
}
...