我正在尝试从Scala案例类到Maps(field_name - > field_value)实现(de)序列化。问题是我不知道如何创建一个函数,它将采用case类类型和map,实例化,填充并返回它。我已经在一些JSON库中看到过这种情况,但我没有得到代码。
答案 0 :(得分:3)
为特定案例类执行此操作非常简单:
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)
但我猜你想要创建适用于任何案例类的东西,你不一定知道这些值的名称是什么?
在这种情况下,你将不得不看一下反射(在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)