1

この JSON の例を使用してみましょう。

{
  "bids": [
    [16182.06, 0.02994158],
    [16179.56, 0.01902097],
    [16178.05, 0.06538498]
  ],
  "asks": [
    [16191.92, 0.03597287],
    [16193.33, 0.0839688],
    [16194.95, 0.0857127]
  ]
}

特別なことは何もありません。実際、これは単純にケース クラスに解析できます。

@JsonCodec case class OrderBook(bids: Seq[Seq[Double]], asks: Seq[Seq[Double]])

これはうまくいきます...


問題

実際には、すべての配列のサイズが 2 になることを知っています。

  • 最初の要素 -> 「レート」です
  • 2番目の要素 - >それは「量」です

Circeこれを修正して、次のようなクラス構造に解析したいと思います。

@JsonCodec case class OrderBook(bids: Seq[Elems], asks: Seq[Elems])

case class Elems(rate: Double, amount: Double)

Encoder と Decoder を書いてみました:

object Elems {
  implicit val encodeElems: Encoder[Elems] = (a: Elems) =>
    Json.arr(
      Json.fromDoubleOrNull(a.rate), Json.fromDoubleOrNull(a.amount)
    )

  implicit val decodeElems: Decoder[Elems] = (c: HCursor) =>
    for {
      f <- c.downArray.as[Seq[Double]]
    } yield {
      Elems(f(0), f(1))
    }
}

しかし、それは常にエラーで失敗します:

Caused by: DecodingFailure(CanBuildFrom for A, List(DownArray, DownArray, DownField(bids)))

なんで?私は何を間違っていますか?

4

1 に答える 1