Rok*_*okG 7 maps scala case-class
我正在尝试从Scala案例类到map(field_name - > field_value)实现(de)序列化.问题是我不知道如何创建一个函数,它将采用case类类型和map,实例化,填充并返回它.我在一些JSON库中看到过这种情况,但我没有得到代码.
对于特定的案例类执行此操作很简单:
scala> :paste
// Entering paste mode (ctrl-D to finish)
case class Foo(x: Int, y: Double, z: String) {
def toMap = Map('x -> x, 'y -> y, 'z -> z)
}
object Foo {
def apply(vals: Map[Symbol, Any]): Foo = Foo(vals('x).asInstanceOf[Int], vals('y).asInstanceOf[Double], vals('z).asInstanceOf[String])
}
// Exiting paste mode, now interpreting.
defined class Foo
defined module Foo
scala> Foo(Map('x -> 1, 'y -> 2.0, 'z -> "wibble"))
res0: Foo = Foo(1,2.0,wibble)
scala> res0.toMap
res1: scala.collection.immutable.Map[Symbol,Any] = Map('x -> 1, 'y -> 2.0, 'z -> wibble)
Run Code Online (Sandbox Code Playgroud)
但我猜您想创建适用于任何案例类的东西,而您不一定知道值的名称是什么?
在这种情况下,您将不得不查看反射(在 Scala 2.10.0 中添加):
http://docs.scala-lang.org/overviews/reflection/overview.html
您可以使用反射来迭代类的成员,找出它们的名称,然后创建映射。例如:
scala> import reflect.runtime.universe._
import reflect.runtime.universe._
scala> typeOf[Foo].members filter { m => m.isMethod && m.asMethod.isStable }
res2: Iterable[reflect.runtime.universe.Symbol] = SynchronizedOps(value z, value y, value x)
Run Code Online (Sandbox Code Playgroud)