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