Самый простой способ обработки такого случая, вероятно, состоит в том, чтобы заменить cars
член класса Cars
на тип, подобный Map[String, CarDetails]
, полностью исключив класс Car
. Если вы сделаете это, ваш код будет работать точно так же, как есть (за исключением определения Car
), и будет декодировать предоставленный вами пример JSON.
Если вы хотите что-то более близкое к структуре вашего класса дел, вы можете сделать следующее:
import io.circe.Decoder
import io.circe.generic.JsonCodec
case class Cars(cars: List[Car])
object Cars {
implicit val decodeCars: Decoder[Cars] =
Decoder[Map[String, CarDetails]].prepare(_.downField("cars")).map(kvs =>
Cars(
kvs.map {
case (k, v) => Car(k, v)
}.toList
)
)
}
// I've added an `id` member here as a way to hold on to the JSON key.
case class Car(id: String, whatShouldThisBe: CarDetails)
@JsonCodec
case class CarDetails(name: String)
Это будет декодировать тот же JSON, но будет включать динамические клавиши на уровне Car
.