Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Circe将JSON数组解析为case类_Json_Scala_Circe - Fatal编程技术网

使用Circe将JSON数组解析为case类

使用Circe将JSON数组解析为case类,json,scala,circe,Json,Scala,Circe,让我们使用这个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] ] } 没有什么特别的,事实上,这可以简单地解析为一个case类: @Js

让我们使用这个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]
  ]
}
没有什么特别的,事实上,这可以简单地解析为一个case类:

@JsonCodec case class OrderBook(bids: Seq[Seq[Double]], asks: Seq[Seq[Double]])
这很有效


问题 我知道每个数组的大小都是2

  • 第一个元素->它是“速率”
  • 第二个元素->它是“金额”
我想用
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))
    }
}

为什么??我做错了什么?

downArray
将焦点从列表移动到其第一个元素。当使用
Elems.decodelems
时,
c=
,因此
c.downArray=
,然后您尝试
.as[Seq[Double]]
,它会爆炸。其次,您应该使用
作为[(Double,Double)]
,它将像您一样解码列表,但也将确保它正好有2个元素长

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

f
downArray
将焦点从列表移动到它的第一个元素。当使用
Elems.decodelems
时,
c=
,所以
c.downArray=
,然后尝试
。as[Seq[Double]
,它会分解。第二,应该使用
as[(Double,Double)]
,它将像您一样对列表进行解码,但也将确保它正好有两个元素长

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