gpt4 book ai didi

json - 使用 Circe 将 JSON 数组解析为案例类

转载 作者:行者123 更新时间:2023-12-02 20:40:45 28 4
gpt4 key购买 nike

让我们使用这个示例 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,并且

  • 第一个元素 -> 它是“rate”
  • 第二个元素 -> 它是“金额”

我想用 Circe 修复这个问题并将其解析为类结构,例如:

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

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

我尝试编写我的编码器和解码器:

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)))
为什么?我做错了什么?

最佳答案

downArray将焦点从列表移动到其第一个元素。当Elems.decodeElems使用,c = <[1, 2]> ,所以c.downArray = <1> ,然后你尝试 <1>.as[Seq[Double]] ,爆炸。其次,您应该使用as[(Double, Double)] ,它会像您一样解码列表,但也会确保它正好是 2 个元素长。

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

关于json - 使用 Circe 将 JSON 数组解析为案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46132372/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com