2017-11-14 13 views
0

私はScala-Play Jsonにサドルフレームをシリアル化したいユースケースがあります。私はそれが単純な要素型のために働いていた。すなわち、Frame[DateTime, String, Double]となりましたが、要素が複雑なタイプのフレームタイプを直列化しようとすると、少し毛が増えます。 Seq[(DateTime, Double)]この場合、タイプ別にパターンマッチングを正しく行うにはどうすればよいですか?

だから私はプリミティブ要素タイプのために働く基本的なframeWrites実装を持っている:

​​

は、だから私はそうのような複雑な要素タイプを処理できるようにcellWritesを作成:

object JsonUtils { 
implicit def cellWrites[E](elem: E)(implicit tag: ClassTag[E]): JsValue = { 
    elem match { 
    case seq: Seq[(DateTime, Double)] => { 
    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this should but doesn't happen 
     Json.arr(
     seq.map { case (dt: DateTime, value: Double) => 
      Json.obj(dt.toString -> JsNumber(value)) 
     } 
    ) 
    } 
    case doubleValue: Double => JsNumber(doubleValue) 
    case _ => JsString(elem.toString) 
    } 
}} 

問題は、自分のフレームまたはタイプFrame[String, String, Seq[(DateTime, Double)]]が、cellWritesの最初の大文字と一致しないことです。私は暗黙のタグタイプ情報を使ってみましたが、パターンマッチングのためにそれを使用する方法を見つけることができませんでした。これは私が使用しているテストケースのサンプルフレームです:

val today = DateTime.parse("2017-11-14T13:00:00.000+01:00") 
val colIx = Index("x", "y") 
val data = Seq(
    Series(
    "a" -> Seq(
     today.minusHours(2) -> 2.0, 
     today.minusHours(1) -> 1.0, 
     today.minusHours(0) -> 0.0 
    ), 
    "b" -> Seq(
     today.minusHours(1) -> 1.0, 
     today.minusHours(0) -> 0.0 
    ) 
), 
    Series(
    "a" -> Seq(
     today.minusHours(5) -> 5.0, 
     today.minusHours(4) -> 4.0, 
     today.minusHours(3) -> 3.0 
    ), 
    "b" -> Seq(
     today.minusHours(4) -> 4.0, 
     today.minusHours(3) -> 3.0 
    ) 
) 
) 
val frame: Frame[String, String, Seq[(DateTime, Double)]] = Frame(data, colIx) 
println(frame) 

上記のコードはすべて正常にコンパイルされます。ただし、セル要素タイプによるパターンマッチングは機能しません。

答えて

0

OKしたがって、この作品elemは実際にタイプorg.saddle.scalar.Scalar[E]であった、それを見つけた:

implicit def cellWrites[E](scalar: Scalar[E]): JsValue = { 
    val elem = scalar.get 
    elem match { 
    case seq: Seq[(DateTime, Double)] => { 
     Json.arr(
     seq.map { case (dt: DateTime, value: Double) => 
      Json.obj(dt.toString -> JsNumber(value)) 
     } 
    ) 
    } 
    case doubleValue: Double => JsNumber(doubleValue) 
    case _ => JsString(elem.toString) 
    } 
} 
関連する問題