我有一些数据结构,我正在尝试从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 的理想基础,还是我错过了完全不同的东西?
对于尝试解析tickers <- ZIO.fromEither(str.fromJson[Tickers])
的测试用例,他自定义JsonDecoder
decodePairs
期望Tickers
的data
字段也被解析为Tickers
(在Seq
中映射之前)而不是List
\Seq
因此它期望{
而不是[
。
只需删除decoderPairs
,它将回退到默认解码器进行Seq
,如果没有其他问题,希望它应该解析正常。