ZIO Json: отказавшее волокно в списке Json
У меня есть несколько структур данных, которые я пытаюсь вывести из JSON. Краткая версия (или полная здесь):
sealed trait CexPair:
val timestamp: String
// ... (cut for brevity)
implicit val decoderCexPair: JsonDecoder[CexPair] = DeriveJsonDecoder.gen
case class CexPairWithBidAsk(
timestamp: String,
// snip
bid: Double,
ask: Double
) extends CexPair
implicit val decoderWithBidAsk: JsonDecoder[CexPairWithBidAsk] = DeriveJsonDecoder.gen
case class CexPairWithoutBidAsk(
timestamp: String,
// snip
) extends CexPair
implicit val decoderWithoutBidAsk: JsonDecoder[CexPairWithoutBidAsk] = DeriveJsonDecoder.gen
case class Tickers(data: Seq[CexPair])
implicit val decoderTickers: JsonDecoder[Tickers] = DeriveJsonDecoder.gen
implicit val decoderPairs: JsonDecoder[Seq[CexPair]] =
decoderTickers.map(_.data)
Но когда я пытаюсь запустить это, я получаю:
Assertion failed:
Fiber failed.
A checked error was not handled.
.data(expected '{' got '[')
Это говорит мне, что десериализация
Tickers
уже идет наперекосяк. Это потому, что
sealed trait
не является идеальной основой для демаршалинга JSON или мне не хватает чего-то совершенно другого?
1 ответ
Для вас тестовый пример, который пытается разобрать
tickers <- ZIO.fromEither(str.fromJson[Tickers])
, он обычай
JsonDecoder
decodePairs
ожидает
data
поле также должно быть проанализировано как
Tickers
(до отображения в a ) вместо a
List
\ следовательно, ожидается
{
вместо
[
.
Просто удалите
decoderPairs
и он вернется к декодеру по умолчанию для
Seq
и, надеюсь, он должен нормально разобрать, если нет других проблем.