ケース クラスの暗黙的な変換を作成したいと考えています。これが私のドメインです:
case class WbProp(name:String,values:WbVal*)
sealed trait WbVal
case class WbLit(value:String) extends WbVal
case class WbRef(obj:String) extends WbVal
Lift-json オブジェクトに変換したいので、次のようにします。
implicit def lit2json(r:WbLit) :JValue = ("@value"->r.value)
implicit def ref2json(r:WbRef) :JValue = ("@id"->r.obj)
implicit def prop2json(p:WbProp):JValue = JField(p.name,p.values)
json-lift は、A->JValue からの変換がある場合、Seq[A] を JArray に変換できます。ただし、これはそのままでは機能しません。WbVal から json に変換できないため、以下を追加する必要があります。
implicit def val2json(v:WbVal) : JValue = v match {
case l:WbLit => lit2json(l)
case r:WbRef => ref2json(r)
}
封印された特性と、すべてのメンバーからの暗黙の変換で十分であることを願っていました。これを行うよりエレガントな方法はありますか?