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и, надеюсь, он должен нормально разобрать, если нет других проблем.

Другие вопросы по тегам