Как декодировать Json с корневым массивом?
У меня возникли проблемы с выяснением, как декодировать json
с корневым массивом в класс case, используя json4s-jackson
библиотека.
Цель извлечения непосредственно в кейс-класс, а не в 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 ответ
Одним из возможных решений может быть проверка результата декодирования в функции декодера.
замени это
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)
}