让我们使用这个示例 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]
]
}
Run Code Online (Sandbox Code Playgroud)
没什么特别的,事实上,这可以简单地解析为一个案例类:
@JsonCodec case class OrderBook(bids: Seq[Seq[Double]], asks: Seq[Seq[Double]])
Run Code Online (Sandbox Code Playgroud)
这很好用...
我实际上知道每个数组的大小都是 2,并且
我想解决这个问题Circe并将其解析为类结构,例如:
@JsonCodec case class OrderBook(bids: Seq[Elems], asks: Seq[Elems])
case class Elems(rate: Double, amount: Double)
Run Code Online (Sandbox Code Playgroud)
我曾尝试编写我的编码器和解码器:
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))
}
}
Run Code Online (Sandbox Code Playgroud)
但它总是失败并出现错误:
Caused by: DecodingFailure(CanBuildFrom for A, List(DownArray, DownArray, DownField(bids)))
Run Code Online (Sandbox Code Playgroud)
为什么?我究竟做错了什么?
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1150 次 |
| 最近记录: |